agora inbox for [email protected]help / color / mirror / Atom feed
Re: libpq compression 794+ messages / 2 participants [nested] [flat]
* Re: libpq compression @ 2012-07-13 11:33 Magnus Hagander <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Magnus Hagander @ 2012-07-13 11:33 UTC (permalink / raw) To: Robert Haas <[email protected]>; +Cc: Euler Taveira <[email protected]>; Marko Kreen <[email protected]>; Florian Pflug <[email protected]>; Martijn van Oosterhout <[email protected]>; Tom Lane <[email protected]>; Bruce Momjian <[email protected]>; pgsql-hackers; Claes Jakobsson <[email protected]> On Mon, Jun 25, 2012 at 2:26 PM, Magnus Hagander <[email protected]> wrote: > On Mon, Jun 25, 2012 at 4:04 AM, Robert Haas <[email protected]> wrote: >> On Fri, Jun 22, 2012 at 12:38 PM, Euler Taveira <[email protected]> wrote: >>> On 20-06-2012 17:40, Marko Kreen wrote: >>>> On Wed, Jun 20, 2012 at 10:05 PM, Florian Pflug <[email protected]> wrote: >>>>> I'm starting to think that relying on SSL/TLS for compression of >>>>> unencrypted connections might not be such a good idea after all. We'd >>>>> be using the protocol in a way it quite clearly never was intended to >>>>> be used... >>>> >>>> Maybe, but what is the argument that we should avoid >>>> on encryption+compression at the same time? >>>> >>>> AES is quite lightweight compared to compression, so should >>>> be no problem in situations where you care about compression. >>>> >>> If we could solve compression problem without AES that will turn things >>> easier. Compression-only via encryption is a weird manner to solve the problem >>> in the user's POV. >>> >>>> RSA is noticeable, but only for short connections. >>>> Thus easily solvable with connection pooling. >>>> >>> RSA overhead is not the main problem. SSL/TLS setup is. >>> >>>> And for really special compression needs you can always >>>> create a UDF that does custom compression for you. >>>> >>> You have to own the code to modify it; it is not always an option. >>> >>>> So what exactly is the situation we need to solve >>>> with postgres-specific protocol compression? >>>> >>> Compression only support. Why do I need to set up SSL/TLS just for compression? >>> >>> IMHO SSL/TLS use is no different from relying in another library to handle >>> compression for the protocol and more it is compression-specific. That way, we >>> could implement another algorithms in such library without needing to modify >>> libpq code. Using SSL/TLS you are bounded by what SSL/TLS software products >>> decide to use as compression algorithms. I'll be happy to maintain the code >>> iif it is postgres-specific or even as close as possible to core. >> >> I guess my feeling on this is that, so far as I can see, supporting >> compression via OpenSSL involves work and trade-offs, and supporting >> it without depending on OpenSSL also involves work, and trade-offs. > > Nice summary :) > >> So it's not real evident to me that we should prefer one to the other >> on general principle. It seems to me that a lot might come down to >> performance. If someone can demonstrate that using an external >> library involves gets significantly better compression, chews up >> significantly less CPU time, and/or is significantly less code than >> supporting this via OpenSSL, then maybe we ought to consider it. > > I think we should, yes. But as you say, we need to know first. It's > also a question of if one of these compression schemes are trivial > enough that we could embed the code rather than rely on it externally > - I have no idea if that's even remotely possibe, but that would move > the goalposts a bit too. A followup on this thread. I was researching something else, and stumbled across http://www.openssl.org/docs/ssl/SSL_COMP_add_compression_method.html, which says: " The TLS standard (or SSLv3) allows the integration of compression methods into the communication. The TLS RFC does however not specify compression methods or their corresponding identifiers, so there is currently no compatible way to integrate compression with unknown peers. It is therefore currently not recommended to integrate compression into applications. Applications for non-public use may agree on certain compression methods. Using different compression methods with the same identifier will lead to connection failure. " Which I think is another reason to not go down that path as our "official way to do compression". -- Magnus Hagander Me: http://www.hagander.net/ Work: http://www.redpill-linpro.com/ ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 794+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 794+ messages in thread
end of thread, other threads:[~2025-06-23 19:42 UTC | newest] Thread overview: 794+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2012-07-13 11:33 Re: libpq compression Magnus Hagander <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[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