Index: doc/src/sgml/catalogs.sgml
===================================================================
RCS file: /home/alvherre/cvs/pgsql/doc/src/sgml/catalogs.sgml,v
retrieving revision 2.109
diff -c -r2.109 catalogs.sgml
*** doc/src/sgml/catalogs.sgml 26 Jul 2005 16:38:25 -0000 2.109
--- doc/src/sgml/catalogs.sgml 31 Jul 2005 20:19:20 -0000
***************
*** 1187,1192 ****
--- 1187,1206 ----
Multiplier for reltuples to add to
anl_base_thresh>
+
+
+ vac_cost_delay
+ integer
+
+ Custom vacuum_cost_delay> parameter
+
+
+
+ vac_cost_limit
+ integer
+
+ Custom vacuum_cost_limit> parameter
+
***************
*** 1207,1213 ****
Any of the numerical fields can contain -1> (or indeed
any negative value) to indicate that the system-wide default should
! be used for this particular value.
--- 1221,1231 ----
Any of the numerical fields can contain -1> (or indeed
any negative value) to indicate that the system-wide default should
! be used for this particular value. Observe that the
! vac_cost_delay> variable inherits its default value from the
! autovacuum_vacuum_cost_delay> configuration parameter,
! or from vacuum_cost_delay> if the former is set to a negative
! value. The same applies to vac_cost_limit>.
Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /home/alvherre/cvs/pgsql/doc/src/sgml/runtime.sgml,v
retrieving revision 1.341
diff -c -r1.341 runtime.sgml
*** doc/src/sgml/runtime.sgml 30 Jul 2005 17:15:35 -0000 1.341
--- doc/src/sgml/runtime.sgml 31 Jul 2005 23:22:11 -0000
***************
*** 3399,3404 ****
--- 3399,3436 ----
+
+ autovacuum_vacuum_cost_delay (integer)
+
+ autovacuum_vacuum_cost_delay> configuration parameter
+
+
+
+ Specifies the default value that will be applied to each
+ VACUUM> operation, for tables that do not have
+ a default value set in pg_autovacuum>. If a
+ negative value is specified (like the default value of -1),
+ the vacuum_cost_delay> value will be applied instead.
+
+
+
+
+
+ autovacuum_vacuum_cost_limit (integer)
+
+ autovacuum_vacuum_cost_limit> configuration parameter
+
+
+
+ Specifies the default value that will be applied to each
+ VACUUM> operation, for tables that do not have
+ a default value set in pg_autovacuum>. If a
+ negative value is specified (like the default value of -1),
+ the vacuum_cost_limit> value will be applied instead.
+
+
+
+
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.214
diff -c -r1.214 xlog.c
*** src/backend/access/transam/xlog.c 30 Jul 2005 14:15:44 -0000 1.214
--- src/backend/access/transam/xlog.c 31 Jul 2005 21:36:45 -0000
***************
*** 33,38 ****
--- 33,39 ----
#include "catalog/catversion.h"
#include "catalog/pg_control.h"
#include "miscadmin.h"
+ #include "pgstat.h"
#include "postmaster/bgwriter.h"
#include "storage/bufpage.h"
#include "storage/fd.h"
***************
*** 48,54 ****
/*
! * Becauase O_DIRECT bypasses the kernel buffers, and because we never
* read those buffers except during crash recovery, it is a win to use
* it in all cases where we sync on each write(). We could allow O_DIRECT
* with fsync(), but because skipping the kernel buffer forces writes out
--- 49,55 ----
/*
! * Because O_DIRECT bypasses the kernel buffers, and because we never
* read those buffers except during crash recovery, it is a win to use
* it in all cases where we sync on each write(). We could allow O_DIRECT
* with fsync(), but because skipping the kernel buffer forces writes out
***************
*** 4544,4549 ****
--- 4545,4555 ----
} while (record != NULL && recoveryContinue);
/*
+ * Reset pgstat data, because it may be invalid after recovery.
+ */
+ pgstat_reset_all();
+
+ /*
* end of main redo apply loop
*/
Index: src/backend/postmaster/autovacuum.c
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/backend/postmaster/autovacuum.c,v
retrieving revision 1.2
diff -c -r1.2 autovacuum.c
*** src/backend/postmaster/autovacuum.c 29 Jul 2005 19:30:04 -0000 1.2
--- src/backend/postmaster/autovacuum.c 31 Jul 2005 22:45:53 -0000
***************
*** 57,62 ****
--- 57,65 ----
int autovacuum_anl_thresh;
double autovacuum_anl_scale;
+ int autovacuum_vac_cost_delay;
+ int autovacuum_vac_cost_limit;
+
/* Flag to tell if we are in the autovacuum daemon process */
static bool am_autovacuum = false;
***************
*** 74,79 ****
--- 77,89 ----
int32 age;
} autovac_dbase;
+ /* struct to keep track of tables to vacuum */
+ typedef struct autovac_table
+ {
+ Oid relid;
+ int vacuum_cost_delay;
+ int vacuum_cost_limit;
+ } autovac_table;
#ifdef EXEC_BACKEND
static pid_t autovac_forkexec(void);
***************
*** 84,90 ****
static void test_rel_for_autovac(Oid relid, PgStat_StatTabEntry *tabentry,
Form_pg_class classForm, Form_pg_autovacuum avForm,
List **vacuum_tables, List **analyze_tables);
! static void autovacuum_do_vac_analyze(List *relids, bool dovacuum);
/*
--- 94,101 ----
static void test_rel_for_autovac(Oid relid, PgStat_StatTabEntry *tabentry,
Form_pg_class classForm, Form_pg_autovacuum avForm,
List **vacuum_tables, List **analyze_tables);
! static void autovacuum_do_vac_analyze(List *relids, bool doanalyze,
! bool dovacuum, bool full);
/*
***************
*** 469,476 ****
if (whole_db)
{
! elog(DEBUG2, "autovacuum: VACUUM ANALYZE whole database");
! autovacuum_do_vac_analyze(NIL, true);
}
else
{
--- 480,487 ----
if (whole_db)
{
! elog(DEBUG2, "autovacuum: VACUUM FULL whole database");
! autovacuum_do_vac_analyze(NIL, false, true, true);
}
else
{
***************
*** 545,559 ****
*/
if (analyze_tables)
! autovacuum_do_vac_analyze(analyze_tables, false);
CHECK_FOR_INTERRUPTS();
- /* get back to proper context */
- MemoryContextSwitchTo(AutovacMemCxt);
-
if (vacuum_tables)
! autovacuum_do_vac_analyze(vacuum_tables, true);
}
/* Finally close out the last transaction. */
--- 556,585 ----
*/
if (analyze_tables)
! autovacuum_do_vac_analyze(analyze_tables, true, false, false);
CHECK_FOR_INTERRUPTS();
if (vacuum_tables)
! {
! ListCell *cell;
!
!
! foreach(cell, vacuum_tables)
! {
! autovac_table *tab = lfirst(cell);
!
! /* get back to proper context */
! MemoryContextSwitchTo(AutovacMemCxt);
!
! /* Set the cost vacuum parameters for this table */
! VacuumCostDelay = tab->vacuum_cost_delay;
! VacuumCostLimit = tab->vacuum_cost_limit;
!
! autovacuum_do_vac_analyze(list_make1_oid(tab->relid), true,
! true, true);
! }
! }
}
/* Finally close out the last transaction. */
***************
*** 606,611 ****
--- 632,640 ----
/* number of vacuum (resp. analyze) tuples at this time */
float4 vactuples,
anltuples;
+ /* cost-based vacuum delay parameters */
+ int vac_cost_limit;
+ int vac_cost_delay;
/* User disabled it in pg_autovacuum? */
if (avForm && !avForm->enabled)
***************
*** 645,650 ****
--- 674,687 ----
autovacuum_anl_scale : avForm->anl_scale_factor;
anl_base_thresh = (avForm->anl_base_thresh < 0) ?
autovacuum_anl_thresh : avForm->anl_base_thresh;
+
+ vac_cost_limit = (avForm->vac_cost_limit < 0) ?
+ (autovacuum_vac_cost_limit < 0) ? VacuumCostLimit :
+ autovacuum_vac_cost_limit : avForm->vac_cost_limit;
+
+ vac_cost_delay = (avForm->vac_cost_delay < 0) ?
+ (autovacuum_vac_cost_delay < 0) ? VacuumCostDelay :
+ autovacuum_vac_cost_delay : avForm->vac_cost_delay;
}
else
{
***************
*** 653,658 ****
--- 690,701 ----
anl_scale_factor = autovacuum_anl_scale;
anl_base_thresh = autovacuum_anl_thresh;
+
+ vac_cost_limit = (autovacuum_vac_cost_limit < 0) ?
+ VacuumCostLimit : autovacuum_vac_cost_limit;
+
+ vac_cost_delay = (autovacuum_vac_cost_delay < 0) ?
+ VacuumCostDelay : autovacuum_vac_cost_delay;
}
vacthresh = (float4) vac_base_thresh + vac_scale_factor * reltuples;
***************
*** 671,679 ****
/* Determine if this table needs vacuum or analyze. */
if (vactuples > vacthresh)
{
elog(DEBUG2, "will VACUUM ANALYZE %s",
RelationGetRelationName(rel));
! *vacuum_tables = lappend_oid(*vacuum_tables, relid);
}
else if (anltuples > anlthresh)
{
--- 714,730 ----
/* Determine if this table needs vacuum or analyze. */
if (vactuples > vacthresh)
{
+ autovac_table *tab = (autovac_table *)
+ palloc(sizeof(autovac_table));
+
elog(DEBUG2, "will VACUUM ANALYZE %s",
RelationGetRelationName(rel));
!
! tab->relid = relid;
! tab->vacuum_cost_limit = vac_cost_limit;
! tab->vacuum_cost_delay = vac_cost_delay;
!
! *vacuum_tables = lappend(*vacuum_tables, tab);
}
else if (anltuples > anlthresh)
{
***************
*** 691,702 ****
/*
* autovacuum_do_vac_analyze
! * Vacuum or analyze a list of tables; or all tables if relids = NIL
*
* We must be in AutovacMemCxt when this routine is called.
*/
static void
! autovacuum_do_vac_analyze(List *relids, bool dovacuum)
{
VacuumStmt *vacstmt = makeNode(VacuumStmt);
--- 742,754 ----
/*
* autovacuum_do_vac_analyze
! * Vacuum and/or analyze a list of tables; or all tables if relids = NIL
*
* We must be in AutovacMemCxt when this routine is called.
*/
static void
! autovacuum_do_vac_analyze(List *relids, bool doanalyze, bool dovacuum,
! bool full)
{
VacuumStmt *vacstmt = makeNode(VacuumStmt);
***************
*** 709,722 ****
/* Set up command parameters */
vacstmt->vacuum = dovacuum;
! vacstmt->full = false;
! vacstmt->analyze = true;
vacstmt->freeze = false;
vacstmt->verbose = false;
vacstmt->relation = NULL; /* all tables, or not used if relids != NIL */
vacstmt->va_cols = NIL;
vacuum(vacstmt, relids);
}
/*
--- 761,776 ----
/* Set up command parameters */
vacstmt->vacuum = dovacuum;
! vacstmt->full = full;
! vacstmt->analyze = doanalyze;
vacstmt->freeze = false;
vacstmt->verbose = false;
vacstmt->relation = NULL; /* all tables, or not used if relids != NIL */
vacstmt->va_cols = NIL;
vacuum(vacstmt, relids);
+
+ pfree(vacstmt);
}
/*
Index: src/backend/postmaster/pgstat.c
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/backend/postmaster/pgstat.c,v
retrieving revision 1.102
diff -c -r1.102 pgstat.c
*** src/backend/postmaster/pgstat.c 29 Jul 2005 19:30:04 -0000 1.102
--- src/backend/postmaster/pgstat.c 31 Jul 2005 21:36:07 -0000
***************
*** 99,105 ****
* ----------
*/
bool pgstat_collect_startcollector = true;
! bool pgstat_collect_resetonpmstart = true;
bool pgstat_collect_querystring = false;
bool pgstat_collect_tuplelevel = false;
bool pgstat_collect_blocklevel = false;
--- 99,105 ----
* ----------
*/
bool pgstat_collect_startcollector = true;
! bool pgstat_collect_resetonpmstart = false;
bool pgstat_collect_querystring = false;
bool pgstat_collect_tuplelevel = false;
bool pgstat_collect_blocklevel = false;
***************
*** 236,242 ****
* statistics on postmaster start, simply remove the stats file.
*/
if (!pgstat_collect_startcollector || pgstat_collect_resetonpmstart)
! unlink(PGSTAT_STAT_FILENAME);
/*
* Nothing else required if collector will not get started
--- 236,242 ----
* statistics on postmaster start, simply remove the stats file.
*/
if (!pgstat_collect_startcollector || pgstat_collect_resetonpmstart)
! pgstat_reset_all();
/*
* Nothing else required if collector will not get started
***************
*** 455,460 ****
--- 455,472 ----
pgstat_collect_blocklevel = false;
}
+ /*
+ * pgstat_reset_all() -
+ *
+ * Remove the stats file. This is used on server start if the
+ * stats_reset_on_server_start feature is enabled, or if WAL
+ * recovery is needed after a crash.
+ */
+ void
+ pgstat_reset_all(void)
+ {
+ unlink(PGSTAT_STAT_FILENAME);
+ }
#ifdef EXEC_BACKEND
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.280
diff -c -r1.280 guc.c
*** src/backend/utils/misc/guc.c 30 Jul 2005 15:17:20 -0000 1.280
--- src/backend/utils/misc/guc.c 31 Jul 2005 21:15:36 -0000
***************
*** 672,678 ****
NULL
},
&pgstat_collect_resetonpmstart,
! true, NULL, NULL
},
{
{"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
--- 672,678 ----
NULL
},
&pgstat_collect_resetonpmstart,
! false, NULL, NULL
},
{
{"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
***************
*** 1161,1166 ****
--- 1161,1184 ----
},
{
+ {"autovacuum_vacuum_cost_delay", PGC_USERSET, AUTOVACUUM,
+ gettext_noop("Vacuum cost delay in milliseconds, for autovacuum."),
+ NULL
+ },
+ &autovacuum_vac_cost_delay,
+ -1, -1, 1000, NULL, NULL
+ },
+
+ {
+ {"autovacuum_vacuum_cost_limit", PGC_USERSET, AUTOVACUUM,
+ gettext_noop("Vacuum cost amount available before napping, for autovacuum."),
+ NULL
+ },
+ &autovacuum_vac_cost_limit,
+ -1, -1, 10000, NULL, NULL
+ },
+
+ {
{"max_files_per_process", PGC_POSTMASTER, RESOURCES_KERNEL,
gettext_noop("Sets the maximum number of simultaneously open files for each server process."),
NULL
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.155
diff -c -r1.155 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample 30 Jul 2005 15:17:20 -0000 1.155
--- src/backend/utils/misc/postgresql.conf.sample 31 Jul 2005 21:16:43 -0000
***************
*** 287,293 ****
#stats_command_string = off
#stats_block_level = off
#stats_row_level = off
! #stats_reset_on_server_start = on
#---------------------------------------------------------------------------
--- 287,293 ----
#stats_command_string = off
#stats_block_level = off
#stats_row_level = off
! #stats_reset_on_server_start = off
#---------------------------------------------------------------------------
***************
*** 300,305 ****
--- 300,309 ----
#autovacuum_analyze_threshold = 500 # min # of tuple updates before analyze
#autovacuum_vacuum_scale_factor = 0.4 # fraction of rel size before vacuum
#autovacuum_analyze_scale_factor = 0.2 # fraction of rel size before analyze
+ #autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for autovac
+ # negative means use vacuum_cost_delay
+ #autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for autovac
+ # negative means use vacuum_cost_limit
#---------------------------------------------------------------------------
Index: src/include/pgstat.h
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/include/pgstat.h,v
retrieving revision 1.34
diff -c -r1.34 pgstat.h
*** src/include/pgstat.h 29 Jul 2005 19:30:09 -0000 1.34
--- src/include/pgstat.h 31 Jul 2005 21:32:59 -0000
***************
*** 367,372 ****
--- 367,373 ----
extern void pgstat_init(void);
extern int pgstat_start(void);
extern void pgstat_beterm(int pid);
+ extern void pgstat_reset_all(void);
#ifdef EXEC_BACKEND
extern void PgstatBufferMain(int argc, char *argv[]);
Index: src/include/catalog/pg_autovacuum.h
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/include/catalog/pg_autovacuum.h,v
retrieving revision 1.1
diff -c -r1.1 pg_autovacuum.h
*** src/include/catalog/pg_autovacuum.h 14 Jul 2005 05:13:42 -0000 1.1
--- src/include/catalog/pg_autovacuum.h 31 Jul 2005 23:26:27 -0000
***************
*** 34,39 ****
--- 34,41 ----
float4 vac_scale_factor; /* reltuples scaling factor */
int4 anl_base_thresh; /* base threshold value */
float4 anl_scale_factor; /* reltuples scaling factor */
+ int4 vac_cost_delay; /* vacuum cost-based delay */
+ int4 vac_cost_limit; /* vacuum cost limit */
} FormData_pg_autovacuum;
/* ----------------
***************
*** 47,59 ****
* compiler constants for pg_autovacuum
* ----------------
*/
! #define Natts_pg_autovacuum 6
#define Anum_pg_autovacuum_vacrelid 1
#define Anum_pg_autovacuum_enabled 2
#define Anum_pg_autovacuum_vac_base_thresh 3
#define Anum_pg_autovacuum_vac_scale_factor 4
#define Anum_pg_autovacuum_anl_base_thresh 5
#define Anum_pg_autovacuum_anl_scale_factor 6
/* There are no preloaded tuples in pg_autovacuum.h */
--- 49,63 ----
* compiler constants for pg_autovacuum
* ----------------
*/
! #define Natts_pg_autovacuum 8
#define Anum_pg_autovacuum_vacrelid 1
#define Anum_pg_autovacuum_enabled 2
#define Anum_pg_autovacuum_vac_base_thresh 3
#define Anum_pg_autovacuum_vac_scale_factor 4
#define Anum_pg_autovacuum_anl_base_thresh 5
#define Anum_pg_autovacuum_anl_scale_factor 6
+ #define Anum_pg_autovacuum_vac_cost_delay 7
+ #define Anum_pg_autovacuum_vac_cost_limit 8
/* There are no preloaded tuples in pg_autovacuum.h */
Index: src/include/postmaster/autovacuum.h
===================================================================
RCS file: /home/alvherre/cvs/pgsql/src/include/postmaster/autovacuum.h,v
retrieving revision 1.1
diff -c -r1.1 autovacuum.h
*** src/include/postmaster/autovacuum.h 14 Jul 2005 05:13:43 -0000 1.1
--- src/include/postmaster/autovacuum.h 31 Jul 2005 17:32:12 -0000
***************
*** 21,26 ****
--- 21,28 ----
extern double autovacuum_vac_scale;
extern int autovacuum_anl_thresh;
extern double autovacuum_anl_scale;
+ extern int autovacuum_vac_cost_delay;
+ extern int autovacuum_vac_cost_limit;
/* Status inquiry functions */
extern bool AutoVacuumingActive(void);