agora inbox for [email protected]help / color / mirror / Atom feed
TODO items.. 807+ messages / 9 participants [nested] [flat]
* TODO items.. @ 2006-04-22 07:15 Dhanaraj M <[email protected]> 0 siblings, 2 replies; 807+ messages in thread From: Dhanaraj M @ 2006-04-22 07:15 UTC (permalink / raw) To: pgsql-hackers I saw the following in the TODO list. I am currently trying to work on them. I could not understand clearly what needs to be done. Can anybody give me the details for the following so that I can work on? clients-psql ========= 1. Have psql show current values for a sequence 2. Fix psql's display of schema information (Neil) Please explain me the current feature that is supported and expected out of it. Thanks Dhanaraj ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-22 15:24 Alvaro Herrera <[email protected]> parent: Dhanaraj M <[email protected]> 1 sibling, 2 replies; 807+ messages in thread From: Alvaro Herrera @ 2006-04-22 15:24 UTC (permalink / raw) To: Dhanaraj M <[email protected]>; +Cc: pgsql-hackers Dhanaraj M wrote: > I saw the following in the TODO list. I am currently trying to work on them. > I could not understand clearly what needs to be done. Can anybody give me > the details for the following so that I can work on? > > clients-psql > ========= > 1. Have psql show current values for a sequence This one means when you do a \dt of a sequence, add a column to display the current value. -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc. ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-22 15:37 Gevik Babakhani <[email protected]> parent: Alvaro Herrera <[email protected]> 1 sibling, 1 reply; 807+ messages in thread From: Gevik Babakhani @ 2006-04-22 15:37 UTC (permalink / raw) To: Alvaro Herrera <[email protected]>; +Cc: Dhanaraj M <[email protected]>; pgsql-hackers > This one means when you do a \dt of a sequence, add a column to display > the current value. > Perhaps this one will be tricky because you will never be sure to get the last sequence number when you query for it. The number could change the moment the query is finished. ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-22 15:57 Martijn van Oosterhout <[email protected]> parent: Gevik Babakhani <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Martijn van Oosterhout @ 2006-04-22 15:57 UTC (permalink / raw) To: Gevik Babakhani <[email protected]>; +Cc: Alvaro Herrera <[email protected]>; Dhanaraj M <[email protected]>; pgsql-hackers On Sat, Apr 22, 2006 at 05:37:28PM +0200, Gevik Babakhani wrote: > > > This one means when you do a \dt of a sequence, add a column to display > > the current value. > > > > Perhaps this one will be tricky because you will never be sure to get > the last sequence number when you query for it. The number could change > the moment the query is finished. So could the structure of a table or the definition of a function. That's just a fact of life. Doesn't change the fact that it'd be useful. You need nextval() to actually get a useful value for queries... Have a nice day, -- Martijn van Oosterhout <[email protected]> http://svana.org/kleptog/ > From each according to his ability. To each according to his ability to litigate. Attachments: [application/pgp-signature] signature.asc (189B, ../../[email protected]/2-signature.asc) download ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-22 16:08 Bruce Momjian <[email protected]> parent: Dhanaraj M <[email protected]> 1 sibling, 1 reply; 807+ messages in thread From: Bruce Momjian @ 2006-04-22 16:08 UTC (permalink / raw) To: Dhanaraj M <[email protected]>; +Cc: pgsql-hackers Dhanaraj M wrote: > I saw the following in the TODO list. I am currently trying to work on them. > I could not understand clearly what needs to be done. Can anybody give me > the details for the following so that I can work on? > > clients-psql > ========= > 1. Have psql show current values for a sequence Already answered. > 2. Fix psql's display of schema information (Neil) > > Please explain me the current feature that is supported and expected > out of it. Yes, this item was unclear. I used text suggested by the author: http://archives.postgresql.org/pgsql-hackers/2004-12/msg00094.php but that was not clear. TODO is now: o Fix psql's \dn for various schema combinations (Neil) http://archives.postgresql.org/pgsql-hackers/2004-11/msg00014.php with a URL that has the details. Thanks for pointing out the problem. -- Bruce Momjian http://candle.pha.pa.us EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. + ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-22 17:34 Tom Lane <[email protected]> parent: Bruce Momjian <[email protected]> 0 siblings, 2 replies; 807+ messages in thread From: Tom Lane @ 2006-04-22 17:34 UTC (permalink / raw) To: Bruce Momjian <[email protected]>; +Cc: Dhanaraj M <[email protected]>; pgsql-hackers Bruce Momjian <[email protected]> writes: > but that was not clear. TODO is now: > o Fix psql's \dn for various schema combinations (Neil) > http://archives.postgresql.org/pgsql-hackers/2004-11/msg00014.php > with a URL that has the details. Thanks for pointing out the problem. You might want to also include a link to the thread start, http://archives.postgresql.org/pgsql-hackers/2004-10/msg00989.php because the above message doesn't link there (I think our mail archiver has trouble with following threads across month boundaries). Also, the TODO item could be worded * Make psql's \d commands more consistent because that's really what Neil is on about ... regards, tom lane ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-22 18:17 Bruce Momjian <[email protected]> parent: Tom Lane <[email protected]> 1 sibling, 0 replies; 807+ messages in thread From: Bruce Momjian @ 2006-04-22 18:17 UTC (permalink / raw) To: Tom Lane <[email protected]>; +Cc: Dhanaraj M <[email protected]>; pgsql-hackers OK, done. --------------------------------------------------------------------------- Tom Lane wrote: > Bruce Momjian <[email protected]> writes: > > but that was not clear. TODO is now: > > o Fix psql's \dn for various schema combinations (Neil) > > http://archives.postgresql.org/pgsql-hackers/2004-11/msg00014.php > > with a URL that has the details. Thanks for pointing out the problem. > > You might want to also include a link to the thread start, > http://archives.postgresql.org/pgsql-hackers/2004-10/msg00989.php > > because the above message doesn't link there (I think our mail archiver > has trouble with following threads across month boundaries). > > Also, the TODO item could be worded > > * Make psql's \d commands more consistent > > because that's really what Neil is on about ... > > regards, tom lane > > ---------------------------(end of broadcast)--------------------------- > TIP 6: explain analyze is your friend > -- Bruce Momjian http://candle.pha.pa.us EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. + ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-23 15:06 Robert Treat <[email protected]> parent: Tom Lane <[email protected]> 1 sibling, 1 reply; 807+ messages in thread From: Robert Treat @ 2006-04-23 15:06 UTC (permalink / raw) To: pgsql-hackers; +Cc: Tom Lane <[email protected]>; Bruce Momjian <[email protected]>; Dhanaraj M <[email protected]> On Saturday 22 April 2006 13:34, Tom Lane wrote: > Also, the TODO item could be worded > > * Make psql's \d commands more consistent > > because that's really what Neil is on about ... > like making \df only show user functions and \dfS show system functions, like all the other objects? :-) -- Robert Treat Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-23 15:07 Robert Treat <[email protected]> parent: Alvaro Herrera <[email protected]> 1 sibling, 1 reply; 807+ messages in thread From: Robert Treat @ 2006-04-23 15:07 UTC (permalink / raw) To: pgsql-hackers; +Cc: Alvaro Herrera <[email protected]>; Dhanaraj M <[email protected]> On Saturday 22 April 2006 11:24, Alvaro Herrera wrote: > Dhanaraj M wrote: > > I saw the following in the TODO list. I am currently trying to work on > > them. I could not understand clearly what needs to be done. Can anybody > > give me the details for the following so that I can work on? > > > > clients-psql > > ========= > > 1. Have psql show current values for a sequence > > This one means when you do a \dt of a sequence, add a column to display > the current value. Um, I think you meant \ds right ? -- Robert Treat Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-23 15:42 Alvaro Herrera <[email protected]> parent: Robert Treat <[email protected]> 0 siblings, 1 reply; 807+ messages in thread From: Alvaro Herrera @ 2006-04-23 15:42 UTC (permalink / raw) To: Robert Treat <[email protected]>; +Cc: pgsql-hackers; Dhanaraj M <[email protected]> Robert Treat wrote: > On Saturday 22 April 2006 11:24, Alvaro Herrera wrote: > > Dhanaraj M wrote: > > > I saw the following in the TODO list. I am currently trying to work on > > > them. I could not understand clearly what needs to be done. Can anybody > > > give me the details for the following so that I can work on? > > > > > > clients-psql > > > ========= > > > 1. Have psql show current values for a sequence > > > > This one means when you do a \dt of a sequence, add a column to display > > the current value. > > Um, I think you meant \ds right ? Whatever. I don't display sequences a lot myself ... -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-23 15:55 Stephen Frost <[email protected]> parent: Robert Treat <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Stephen Frost @ 2006-04-23 15:55 UTC (permalink / raw) To: Robert Treat <[email protected]>; +Cc: pgsql-hackers; Tom Lane <[email protected]>; Bruce Momjian <[email protected]>; Dhanaraj M <[email protected]> * Robert Treat ([email protected]) wrote: > On Saturday 22 April 2006 13:34, Tom Lane wrote: > > Also, the TODO item could be worded > > > > * Make psql's \d commands more consistent > > > > because that's really what Neil is on about ... > > > > like making \df only show user functions and \dfS show system functions, like > all the other objects? :-) How about also having it show the owner (instead of having to use \df+ which gets huge...) and the permissions... Or perhaps have a seperate \dfp or something to get that information. It's annoying to have to either query the catalog directly or look through \df+ for why I can't drop a given function. Thanks, Stephen Attachments: [application/pgp-signature] signature.asc (189B, ../../[email protected]/2-signature.asc) download ^ permalink raw reply [nested|flat] 807+ messages in thread
* Re: TODO items.. @ 2006-04-23 20:08 Robert Treat <[email protected]> parent: Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Robert Treat @ 2006-04-23 20:08 UTC (permalink / raw) To: Alvaro Herrera <[email protected]>; +Cc: pgsql-hackers; Dhanaraj M <[email protected]> On Sunday 23 April 2006 11:42, Alvaro Herrera wrote: > Robert Treat wrote: > > On Saturday 22 April 2006 11:24, Alvaro Herrera wrote: > > > Dhanaraj M wrote: > > > > I saw the following in the TODO list. I am currently trying to work > > > > on them. I could not understand clearly what needs to be done. Can > > > > anybody give me the details for the following so that I can work on? > > > > > > > > clients-psql > > > > ========= > > > > 1. Have psql show current values for a sequence > > > > > > This one means when you do a \dt of a sequence, add a column to display > > > the current value. > > > > Um, I think you meant \ds right ? > > Whatever. I don't display sequences a lot myself ... :-) I double checked because I wasn't sure myself, but figured it was best to clarify rather than risk confusing the noobs. :-) -- Robert Treat Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
* [PATCH v1 2/4] autovac: resolve relopts before vacuuming @ 2025-06-23 19:42 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 807+ messages in thread From: Nathan Bossart @ 2025-06-23 19:42 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 7 ++-- src/backend/postmaster/autovacuum.c | 52 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 33a33bf6b1c..0015b9ef4b0 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -421,7 +421,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* * Later, in vacuum_rel(), we check if a reloption override was specified. */ - params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + params.max_eager_freeze_failure_rate = -1.0; /* * Create special memory context for cross-transaction storage. @@ -2195,10 +2195,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Check if the vacuum_max_eager_freeze_failure_rate table storage * parameter was specified. This overrides the GUC value. */ - if (rel->rd_options != NULL && + if (params->max_eager_freeze_failure_rate < 0 && + rel->rd_options != NULL && ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + else + params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; /* * Set truncate option based on truncate reloption or GUC if it wasn't diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f86c9fed853..3bedca971ff 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2758,6 +2758,9 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, int multixact_freeze_table_age; int log_min_duration; AutoVacOpts *avopts = (relopts ? &relopts->autovacuum : NULL); + VacOptValue index_cleanup; + VacOptValue truncate; + double max_eager_freeze_failure_rate; /* * Calculate the vacuum cost parameters and the freeze ages. If there @@ -2790,6 +2793,39 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, ? avopts->multixact_freeze_table_age : default_multixact_freeze_table_age; + if (relopts) + { + switch (relopts->vacuum_index_cleanup) + { + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO: + index_cleanup = VACOPTVALUE_AUTO; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON: + index_cleanup = VACOPTVALUE_ENABLED; + break; + case STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF: + index_cleanup = VACOPTVALUE_DISABLED; + break; + } + } + else + index_cleanup = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_truncate_set) + { + if (relopts->vacuum_truncate) + truncate = VACOPTVALUE_ENABLED; + else + truncate = VACOPTVALUE_DISABLED; + } + else + truncate = VACOPTVALUE_UNSPECIFIED; + + if (relopts && relopts->vacuum_max_eager_freeze_failure_rate >= 0) + max_eager_freeze_failure_rate = relopts->vacuum_max_eager_freeze_failure_rate; + else + max_eager_freeze_failure_rate = -1.0; + tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; tab->at_sharedrel = classForm->relisshared; @@ -2806,13 +2842,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, (doanalyze ? VACOPT_ANALYZE : 0) | (!wraparound ? VACOPT_SKIP_LOCKED : 0); - /* - * index_cleanup and truncate are unspecified at first in autovacuum. - * They will be filled in with usable values using their reloptions - * (or reloption defaults) later. - */ - tab->at_params.index_cleanup = VACOPTVALUE_UNSPECIFIED; - tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED; + tab->at_params.index_cleanup = index_cleanup; + tab->at_params.truncate = truncate; /* As of now, we don't support parallel vacuum for autovacuum */ tab->at_params.nworkers = -1; tab->at_params.freeze_min_age = freeze_min_age; @@ -2822,12 +2853,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; tab->at_params.toast_parent = InvalidOid; - - /* - * Later, in vacuum_rel(), we check reloptions for any - * vacuum_max_eager_freeze_failure_rate override. - */ - tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; + tab->at_params.max_eager_freeze_failure_rate = max_eager_freeze_failure_rate; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0003-autovac-combine-reloptions-correctly.patch ^ permalink raw reply [nested|flat] 807+ messages in thread
end of thread, other threads:[~2025-06-23 19:42 UTC | newest] Thread overview: 807+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2006-04-22 07:15 TODO items.. Dhanaraj M <[email protected]> 2006-04-22 15:24 ` Alvaro Herrera <[email protected]> 2006-04-22 15:37 ` Gevik Babakhani <[email protected]> 2006-04-22 15:57 ` Martijn van Oosterhout <[email protected]> 2006-04-23 15:07 ` Robert Treat <[email protected]> 2006-04-23 15:42 ` Alvaro Herrera <[email protected]> 2006-04-23 20:08 ` Robert Treat <[email protected]> 2006-04-22 16:08 ` Bruce Momjian <[email protected]> 2006-04-22 17:34 ` Tom Lane <[email protected]> 2006-04-22 18:17 ` Bruce Momjian <[email protected]> 2006-04-23 15:06 ` Robert Treat <[email protected]> 2006-04-23 15:55 ` Stephen Frost <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts before vacuuming Nathan Bossart <[email protected]> 2025-06-23 19:42 [PATCH v1 2/4] autovac: resolve relopts 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