Commit d90c5311 authored by Tom Lane's avatar Tom Lane

Autovacuum loose end mop-up. Provide autovacuum-specific vacuum cost

delay and limit, both as global GUCs and as table-specific entries in
pg_autovacuum.  stats_reset_on_server_start is now OFF by default,
but a reset is forced if we did WAL replay.  XID-wrap vacuums do not
ANALYZE, but do FREEZE if it's a template database.  Alvaro Herrera
parent f6c30d54
<!-- <!--
Documentation of the system catalogs, directed toward PostgreSQL developers Documentation of the system catalogs, directed toward PostgreSQL developers
$PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.110 2005/07/31 17:19:16 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.111 2005/08/11 21:11:41 tgl Exp $
--> -->
<chapter id="catalogs"> <chapter id="catalogs">
...@@ -1197,6 +1197,20 @@ ...@@ -1197,6 +1197,20 @@
<entry>Multiplier for reltuples to add to <entry>Multiplier for reltuples to add to
<structfield>anl_base_thresh</></entry> <structfield>anl_base_thresh</></entry>
</row> </row>
<row>
<entry><structfield>vac_cost_delay</structfield></entry>
<entry><type>integer</type></entry>
<entry></entry>
<entry>Custom <varname>vacuum_cost_delay</> parameter</entry>
</row>
<row>
<entry><structfield>vac_cost_limit</structfield></entry>
<entry><type>integer</type></entry>
<entry></entry>
<entry>Custom <varname>vacuum_cost_limit</> parameter</entry>
</row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>
...@@ -1217,7 +1231,11 @@ ...@@ -1217,7 +1231,11 @@
<para> <para>
Any of the numerical fields can contain <literal>-1</> (or indeed Any of the numerical fields can contain <literal>-1</> (or indeed
any negative value) to indicate that the system-wide default should any negative value) to indicate that the system-wide default should
be used for this particular value. be used for this particular value. Observe that the
<structfield>vac_cost_delay</> variable inherits its default value from the
<varname>autovacuum_vacuum_cost_delay</> configuration parameter,
or from <varname>vacuum_cost_delay</> if the former is set to a negative
value. The same applies to <structfield>vac_cost_limit</>.
</para> </para>
</sect1> </sect1>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.343 2005/08/09 05:01:10 momjian Exp $ $PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.344 2005/08/11 21:11:42 tgl Exp $
--> -->
<chapter Id="runtime"> <chapter Id="runtime">
...@@ -3296,7 +3296,7 @@ SELECT * FROM parent WHERE key = 2400; ...@@ -3296,7 +3296,7 @@ SELECT * FROM parent WHERE key = 2400;
<para> <para>
If on, collected statistics are zeroed out whenever the server If on, collected statistics are zeroed out whenever the server
is restarted. If off, statistics are accumulated across server is restarted. If off, statistics are accumulated across server
restarts. The default is <literal>on</>. This option can only restarts. The default is <literal>off</>. This option can only
be set at server start. be set at server start.
</para> </para>
</listitem> </listitem>
...@@ -3424,6 +3424,40 @@ SELECT * FROM parent WHERE key = 2400; ...@@ -3424,6 +3424,40 @@ SELECT * FROM parent WHERE key = 2400;
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry id="guc-autovacuum-vacuum-cost-delay" xreflabel="autovacuum_vacuum_cost_delay">
<term><varname>autovacuum_vacuum_cost_delay</varname> (<type>integer</type>)</term>
<indexterm>
<primary><varname>autovacuum_vacuum_cost_delay</> configuration parameter</primary>
</indexterm>
<listitem>
<para>
Specifies the cost delay value that will be used in automatic
<command>VACUUM</> operations. If -1 is specified (which is the
default), the regular
<xref linkend="guc-vacuum-cost-delay"> value will be used.
This setting can be overridden for individual tables by entries in
<structname>pg_autovacuum</>.
</para>
</listitem>
</varlistentry>
<varlistentry id="guc-autovacuum-vacuum-cost-limit" xreflabel="autovacuum_vacuum_cost_limit">
<term><varname>autovacuum_vacuum_cost_limit</varname> (<type>integer</type>)</term>
<indexterm>
<primary><varname>autovacuum_vacuum_cost_limit</> configuration parameter</primary>
</indexterm>
<listitem>
<para>
Specifies the cost limit value that will be used in automatic
<command>VACUUM</> operations. If -1 is specified (which is the
default), the regular
<xref linkend="guc-vacuum-cost-limit"> value will be used.
This setting can be overridden for individual tables by entries in
<structname>pg_autovacuum</>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
</sect2> </sect2>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.214 2005/07/30 14:15:44 momjian Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.215 2005/08/11 21:11:43 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "catalog/catversion.h" #include "catalog/catversion.h"
#include "catalog/pg_control.h" #include "catalog/pg_control.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "pgstat.h"
#include "postmaster/bgwriter.h" #include "postmaster/bgwriter.h"
#include "storage/bufpage.h" #include "storage/bufpage.h"
#include "storage/fd.h" #include "storage/fd.h"
...@@ -48,7 +49,7 @@ ...@@ -48,7 +49,7 @@
/* /*
* Becauase O_DIRECT bypasses the kernel buffers, and because we never * Because O_DIRECT bypasses the kernel buffers, and because we never
* read those buffers except during crash recovery, it is a win to use * 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 * 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 * with fsync(), but because skipping the kernel buffer forces writes out
...@@ -4685,6 +4686,11 @@ StartupXLOG(void) ...@@ -4685,6 +4686,11 @@ StartupXLOG(void)
RmgrTable[rmid].rm_cleanup(); RmgrTable[rmid].rm_cleanup();
} }
/*
* Reset pgstat data, because it may be invalid after recovery.
*/
pgstat_reset_all();
/* /*
* Perform a new checkpoint to update our recovery activity to * Perform a new checkpoint to update our recovery activity to
* disk. * disk.
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.146 2005/07/29 19:30:04 tgl Exp $ * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.147 2005/08/11 21:11:44 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1001,13 +1001,15 @@ load_hba(void) ...@@ -1001,13 +1001,15 @@ load_hba(void)
* dboid: gets database OID * dboid: gets database OID
* dbtablespace: gets database's default tablespace's OID * dbtablespace: gets database's default tablespace's OID
* dbfrozenxid: gets database's frozen XID * dbfrozenxid: gets database's frozen XID
* dbvacuumxid: gets database's vacuum XID
* *
* This is not much related to the other functions in hba.c, but we put it * This is not much related to the other functions in hba.c, but we put it
* here because it uses the next_token() infrastructure. * here because it uses the next_token() infrastructure.
*/ */
bool bool
read_pg_database_line(FILE *fp, char *dbname, Oid *dboid, read_pg_database_line(FILE *fp, char *dbname, Oid *dboid,
Oid *dbtablespace, TransactionId *dbfrozenxid) Oid *dbtablespace, TransactionId *dbfrozenxid,
TransactionId *dbvacuumxid)
{ {
char buf[MAX_TOKEN]; char buf[MAX_TOKEN];
...@@ -1030,6 +1032,10 @@ read_pg_database_line(FILE *fp, char *dbname, Oid *dboid, ...@@ -1030,6 +1032,10 @@ read_pg_database_line(FILE *fp, char *dbname, Oid *dboid,
if (!isdigit((unsigned char) buf[0])) if (!isdigit((unsigned char) buf[0]))
elog(FATAL, "bad data in flat pg_database file"); elog(FATAL, "bad data in flat pg_database file");
*dbfrozenxid = atoxid(buf); *dbfrozenxid = atoxid(buf);
next_token(fp, buf, sizeof(buf));
if (!isdigit((unsigned char) buf[0]))
elog(FATAL, "bad data in flat pg_database file");
*dbvacuumxid = atoxid(buf);
/* expect EOL next */ /* expect EOL next */
if (next_token(fp, buf, sizeof(buf))) if (next_token(fp, buf, sizeof(buf)))
elog(FATAL, "bad data in flat pg_database file"); elog(FATAL, "bad data in flat pg_database file");
......
This diff is collapsed.
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* *
* Copyright (c) 2001-2005, PostgreSQL Global Development Group * Copyright (c) 2001-2005, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.104 2005/08/09 21:14:55 tgl Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.105 2005/08/11 21:11:44 tgl Exp $
* ---------- * ----------
*/ */
#include "postgres.h" #include "postgres.h"
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
* ---------- * ----------
*/ */
bool pgstat_collect_startcollector = true; bool pgstat_collect_startcollector = true;
bool pgstat_collect_resetonpmstart = true; bool pgstat_collect_resetonpmstart = false;
bool pgstat_collect_querystring = false; bool pgstat_collect_querystring = false;
bool pgstat_collect_tuplelevel = false; bool pgstat_collect_tuplelevel = false;
bool pgstat_collect_blocklevel = false; bool pgstat_collect_blocklevel = false;
...@@ -237,7 +237,7 @@ pgstat_init(void) ...@@ -237,7 +237,7 @@ pgstat_init(void)
* statistics on postmaster start, simply remove the stats file. * statistics on postmaster start, simply remove the stats file.
*/ */
if (!pgstat_collect_startcollector || pgstat_collect_resetonpmstart) if (!pgstat_collect_startcollector || pgstat_collect_resetonpmstart)
unlink(PGSTAT_STAT_FILENAME); pgstat_reset_all();
/* /*
* Nothing else required if collector will not get started * Nothing else required if collector will not get started
...@@ -456,6 +456,18 @@ startup_failed: ...@@ -456,6 +456,18 @@ startup_failed:
pgstat_collect_blocklevel = false; 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 #ifdef EXEC_BACKEND
...@@ -677,11 +689,19 @@ pgstat_bestart(void) ...@@ -677,11 +689,19 @@ pgstat_bestart(void)
if (pgStatSock < 0) if (pgStatSock < 0)
return; return;
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_BESTART); /*
msg.m_databaseid = MyDatabaseId; * We may not have a MyProcPort (eg, if this is the autovacuum process).
msg.m_userid = GetSessionUserId(); * For the moment, punt and don't send BESTART --- would be better to
memcpy(&msg.m_clientaddr, &MyProcPort->raddr, sizeof(msg.m_clientaddr)); * work out a clean way of handling "unknown clientaddr".
pgstat_send(&msg, sizeof(msg)); */
if (MyProcPort)
{
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_BESTART);
msg.m_databaseid = MyDatabaseId;
msg.m_userid = GetSessionUserId();
memcpy(&msg.m_clientaddr, &MyProcPort->raddr, sizeof(msg.m_clientaddr));
pgstat_send(&msg, sizeof(msg));
}
/* /*
* Set up a process-exit hook to ensure we flush the last batch of * Set up a process-exit hook to ensure we flush the last batch of
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.461 2005/07/29 19:30:04 tgl Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.462 2005/08/11 21:11:44 tgl Exp $
* *
* NOTES * NOTES
* *
...@@ -342,6 +342,7 @@ typedef struct ...@@ -342,6 +342,7 @@ typedef struct
int syslogPipe[2]; int syslogPipe[2];
#endif #endif
char my_exec_path[MAXPGPATH]; char my_exec_path[MAXPGPATH];
char pkglib_path[MAXPGPATH];
char ExtraOptions[MAXPGPATH]; char ExtraOptions[MAXPGPATH];
char lc_collate[LOCALE_NAME_BUFLEN]; char lc_collate[LOCALE_NAME_BUFLEN];
char lc_ctype[LOCALE_NAME_BUFLEN]; char lc_ctype[LOCALE_NAME_BUFLEN];
...@@ -3702,6 +3703,8 @@ save_backend_variables(BackendParameters *param, Port *port, ...@@ -3702,6 +3703,8 @@ save_backend_variables(BackendParameters *param, Port *port,
StrNCpy(param->my_exec_path, my_exec_path, MAXPGPATH); StrNCpy(param->my_exec_path, my_exec_path, MAXPGPATH);
StrNCpy(param->pkglib_path, pkglib_path, MAXPGPATH);
StrNCpy(param->ExtraOptions, ExtraOptions, MAXPGPATH); StrNCpy(param->ExtraOptions, ExtraOptions, MAXPGPATH);
StrNCpy(param->lc_collate, setlocale(LC_COLLATE, NULL), LOCALE_NAME_BUFLEN); StrNCpy(param->lc_collate, setlocale(LC_COLLATE, NULL), LOCALE_NAME_BUFLEN);
...@@ -3903,6 +3906,8 @@ restore_backend_variables(BackendParameters *param, Port *port) ...@@ -3903,6 +3906,8 @@ restore_backend_variables(BackendParameters *param, Port *port)
StrNCpy(my_exec_path, param->my_exec_path, MAXPGPATH); StrNCpy(my_exec_path, param->my_exec_path, MAXPGPATH);
StrNCpy(pkglib_path, param->pkglib_path, MAXPGPATH);
StrNCpy(ExtraOptions, param->ExtraOptions, MAXPGPATH); StrNCpy(ExtraOptions, param->ExtraOptions, MAXPGPATH);
setlocale(LC_COLLATE, param->lc_collate); setlocale(LC_COLLATE, param->lc_collate);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.456 2005/08/08 03:12:12 tgl Exp $ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.457 2005/08/11 21:11:45 tgl Exp $
* *
* NOTES * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
...@@ -162,7 +162,6 @@ static List *pg_rewrite_queries(List *querytree_list); ...@@ -162,7 +162,6 @@ static List *pg_rewrite_queries(List *querytree_list);
static void start_xact_command(void); static void start_xact_command(void);
static void finish_xact_command(void); static void finish_xact_command(void);
static void SigHupHandler(SIGNAL_ARGS); static void SigHupHandler(SIGNAL_ARGS);
static void FloatExceptionHandler(SIGNAL_ARGS);
static void log_disconnections(int code, Datum arg); static void log_disconnections(int code, Datum arg);
...@@ -2151,7 +2150,7 @@ StatementCancelHandler(SIGNAL_ARGS) ...@@ -2151,7 +2150,7 @@ StatementCancelHandler(SIGNAL_ARGS)
} }
/* signal handler for floating point exception */ /* signal handler for floating point exception */
static void void
FloatExceptionHandler(SIGNAL_ARGS) FloatExceptionHandler(SIGNAL_ARGS)
{ {
ereport(ERROR, ereport(ERROR,
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.13 2005/07/28 22:27:02 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.14 2005/08/11 21:11:46 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -208,12 +208,14 @@ write_database_file(Relation drel) ...@@ -208,12 +208,14 @@ write_database_file(Relation drel)
char *datname; char *datname;
Oid datoid; Oid datoid;
Oid dattablespace; Oid dattablespace;
TransactionId datfrozenxid; TransactionId datfrozenxid,
datvacuumxid;
datname = NameStr(dbform->datname); datname = NameStr(dbform->datname);
datoid = HeapTupleGetOid(tuple); datoid = HeapTupleGetOid(tuple);
dattablespace = dbform->dattablespace; dattablespace = dbform->dattablespace;
datfrozenxid = dbform->datfrozenxid; datfrozenxid = dbform->datfrozenxid;
datvacuumxid = dbform->datvacuumxid;
/* /*
* Identify the oldest datfrozenxid, ignoring databases that are not * Identify the oldest datfrozenxid, ignoring databases that are not
...@@ -242,13 +244,14 @@ write_database_file(Relation drel) ...@@ -242,13 +244,14 @@ write_database_file(Relation drel)
} }
/* /*
* The file format is: "dbname" oid tablespace frozenxid * The file format is: "dbname" oid tablespace frozenxid vacuumxid
* *
* The xid is not needed for backend startup, but may be of use * The xids are not needed for backend startup, but are of use to
* for forensic purposes. * autovacuum, and might also be helpful for forensic purposes.
*/ */
fputs_quote(datname, fp); fputs_quote(datname, fp);
fprintf(fp, " %u %u %u\n", datoid, dattablespace, datfrozenxid); fprintf(fp, " %u %u %u %u\n",
datoid, dattablespace, datfrozenxid, datvacuumxid);
} }
heap_endscan(scan); heap_endscan(scan);
...@@ -654,8 +657,10 @@ write_auth_file(Relation rel_authid, Relation rel_authmem) ...@@ -654,8 +657,10 @@ write_auth_file(Relation rel_authid, Relation rel_authmem)
* base backup which may be far out of sync with the current state. * base backup which may be far out of sync with the current state.
* *
* In theory we could skip rebuilding the flat files if no WAL replay * In theory we could skip rebuilding the flat files if no WAL replay
* occurred, but it seems safest to just do it always. We have to * occurred, but it seems best to just do it always. We have to
* scan pg_database to compute the XID wrap limit anyway. * scan pg_database to compute the XID wrap limit anyway. Also, this
* policy means we need not force initdb to change the format of the
* flat files.
* *
* In a standalone backend we pass database_only = true to skip processing * In a standalone backend we pass database_only = true to skip processing
* the auth file. We won't need it, and building it could fail if there's * the auth file. We won't need it, and building it could fail if there's
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.156 2005/08/08 03:12:14 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.157 2005/08/11 21:11:46 tgl Exp $
* *
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
...@@ -20,8 +20,10 @@ ...@@ -20,8 +20,10 @@
#include <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
#include "access/genam.h"
#include "access/heapam.h" #include "access/heapam.h"
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/indexing.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
#include "catalog/pg_authid.h" #include "catalog/pg_authid.h"
#include "catalog/pg_database.h" #include "catalog/pg_database.h"
...@@ -79,7 +81,7 @@ FindMyDatabase(const char *name, Oid *db_id, Oid *db_tablespace) ...@@ -79,7 +81,7 @@ FindMyDatabase(const char *name, Oid *db_id, Oid *db_tablespace)
char *filename; char *filename;
FILE *db_file; FILE *db_file;
char thisname[NAMEDATALEN]; char thisname[NAMEDATALEN];
TransactionId frozenxid; TransactionId dummyxid;
filename = database_getflatfilename(); filename = database_getflatfilename();
db_file = AllocateFile(filename, "r"); db_file = AllocateFile(filename, "r");
...@@ -89,7 +91,8 @@ FindMyDatabase(const char *name, Oid *db_id, Oid *db_tablespace) ...@@ -89,7 +91,8 @@ FindMyDatabase(const char *name, Oid *db_id, Oid *db_tablespace)
errmsg("could not open file \"%s\": %m", filename))); errmsg("could not open file \"%s\": %m", filename)));
while (read_pg_database_line(db_file, thisname, db_id, while (read_pg_database_line(db_file, thisname, db_id,
db_tablespace, &frozenxid)) db_tablespace, &dummyxid,
&dummyxid))
{ {
if (strcmp(thisname, name) == 0) if (strcmp(thisname, name) == 0)
{ {
...@@ -131,7 +134,7 @@ static void ...@@ -131,7 +134,7 @@ static void
ReverifyMyDatabase(const char *name) ReverifyMyDatabase(const char *name)
{ {
Relation pgdbrel; Relation pgdbrel;
HeapScanDesc pgdbscan; SysScanDesc pgdbscan;
ScanKeyData key; ScanKeyData key;
HeapTuple tup; HeapTuple tup;
Form_pg_database dbform; Form_pg_database dbform;
...@@ -147,9 +150,10 @@ ReverifyMyDatabase(const char *name) ...@@ -147,9 +150,10 @@ ReverifyMyDatabase(const char *name)
BTEqualStrategyNumber, F_NAMEEQ, BTEqualStrategyNumber, F_NAMEEQ,
NameGetDatum(name)); NameGetDatum(name));
pgdbscan = heap_beginscan(pgdbrel, SnapshotNow, 1, &key); pgdbscan = systable_beginscan(pgdbrel, DatabaseNameIndexId, true,
SnapshotNow, 1, &key);
tup = heap_getnext(pgdbscan, ForwardScanDirection); tup = systable_getnext(pgdbscan);
if (!HeapTupleIsValid(tup) || if (!HeapTupleIsValid(tup) ||
HeapTupleGetOid(tup) != MyDatabaseId) HeapTupleGetOid(tup) != MyDatabaseId)
{ {
...@@ -238,7 +242,7 @@ ReverifyMyDatabase(const char *name) ...@@ -238,7 +242,7 @@ ReverifyMyDatabase(const char *name)
} }
} }
heap_endscan(pgdbscan); systable_endscan(pgdbscan);
heap_close(pgdbrel, RowShareLock); heap_close(pgdbrel, RowShareLock);
} }
...@@ -428,6 +432,18 @@ InitPostgres(const char *dbname, const char *username) ...@@ -428,6 +432,18 @@ InitPostgres(const char *dbname, const char *username)
/* Initialize portal manager */ /* Initialize portal manager */
EnablePortalManager(); EnablePortalManager();
/*
* Set up process-exit callback to do pre-shutdown cleanup. This
* has to be after we've initialized all the low-level modules
* like the buffer manager, because during shutdown this has to
* run before the low-level modules start to close down. On the
* other hand, we want it in place before we begin our first
* transaction --- if we fail during the initialization transaction,
* as is entirely possible, we need the AbortTransaction call to
* clean up.
*/
on_shmem_exit(ShutdownPostgres, 0);
/* start a new transaction here before access to db */ /* start a new transaction here before access to db */
if (!bootstrap) if (!bootstrap)
StartTransactionCommand(); StartTransactionCommand();
...@@ -465,7 +481,8 @@ InitPostgres(const char *dbname, const char *username) ...@@ -465,7 +481,8 @@ InitPostgres(const char *dbname, const char *username)
/* /*
* Unless we are bootstrapping, double-check that InitMyDatabaseInfo() * Unless we are bootstrapping, double-check that InitMyDatabaseInfo()
* got a correct result. We can't do this until all the * got a correct result. We can't do this until all the
* database-access infrastructure is up. * database-access infrastructure is up. (Also, it wants to know if
* the user is a superuser, so the above stuff has to happen first.)
*/ */
if (!bootstrap) if (!bootstrap)
ReverifyMyDatabase(dbname); ReverifyMyDatabase(dbname);
...@@ -509,24 +526,10 @@ InitPostgres(const char *dbname, const char *username) ...@@ -509,24 +526,10 @@ InitPostgres(const char *dbname, const char *username)
/* initialize client encoding */ /* initialize client encoding */
InitializeClientEncoding(); InitializeClientEncoding();
/* /* initialize statistics collection for this backend */
* Initialize statistics collection for this backend. We do this
* here because the shutdown hook it sets up needs to be invoked
* at the corresponding phase of backend shutdown: after
* ShutdownPostgres and before we drop access to shared memory.
*/
if (IsUnderPostmaster) if (IsUnderPostmaster)
pgstat_bestart(); pgstat_bestart();
/*
* Set up process-exit callback to do pre-shutdown cleanup. This
* should be last because we want shmem_exit to call this routine
* before the exit callbacks that are registered by buffer manager,
* lock manager, etc. We need to run this code before we close down
* database access!
*/
on_shmem_exit(ShutdownPostgres, 0);
/* close the transaction we started above */ /* close the transaction we started above */
if (!bootstrap) if (!bootstrap)
CommitTransactionCommand(); CommitTransactionCommand();
...@@ -538,9 +541,7 @@ InitPostgres(const char *dbname, const char *username) ...@@ -538,9 +541,7 @@ InitPostgres(const char *dbname, const char *username)
/* /*
* Backend-shutdown callback. Do cleanup that we want to be sure happens * Backend-shutdown callback. Do cleanup that we want to be sure happens
* before all the supporting modules begin to nail their doors shut via * before all the supporting modules begin to nail their doors shut via
* their own callbacks. Note that because this has to be registered very * their own callbacks.
* late in startup, it will not get called if we suffer a failure *during*
* startup.
* *
* User-level cleanup, such as temp-relation removal and UNLISTEN, happens * User-level cleanup, such as temp-relation removal and UNLISTEN, happens
* via separate callbacks that execute before this one. We don't combine the * via separate callbacks that execute before this one. We don't combine the
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>. * Written by Peter Eisentraut <peter_e@gmx.net>.
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.280 2005/07/30 15:17:20 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.281 2005/08/11 21:11:47 tgl Exp $
* *
*-------------------------------------------------------------------- *--------------------------------------------------------------------
*/ */
...@@ -672,7 +672,7 @@ static struct config_bool ConfigureNamesBool[] = ...@@ -672,7 +672,7 @@ static struct config_bool ConfigureNamesBool[] =
NULL NULL
}, },
&pgstat_collect_resetonpmstart, &pgstat_collect_resetonpmstart,
true, NULL, NULL false, NULL, NULL
}, },
{ {
{"stats_command_string", PGC_SUSET, STATS_COLLECTOR, {"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
...@@ -1160,6 +1160,24 @@ static struct config_int ConfigureNamesInt[] = ...@@ -1160,6 +1160,24 @@ static struct config_int ConfigureNamesInt[] =
0, 0, 1000, NULL, NULL 0, 0, 1000, NULL, NULL
}, },
{
{"autovacuum_vacuum_cost_delay", PGC_SIGHUP, 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_SIGHUP, 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, {"max_files_per_process", PGC_POSTMASTER, RESOURCES_KERNEL,
gettext_noop("Sets the maximum number of simultaneously open files for each server process."), gettext_noop("Sets the maximum number of simultaneously open files for each server process."),
......
...@@ -288,7 +288,7 @@ ...@@ -288,7 +288,7 @@
#stats_command_string = off #stats_command_string = off
#stats_block_level = off #stats_block_level = off
#stats_row_level = off #stats_row_level = off
#stats_reset_on_server_start = on #stats_reset_on_server_start = off
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -301,6 +301,10 @@ ...@@ -301,6 +301,10 @@
#autovacuum_analyze_threshold = 500 # min # of tuple updates before analyze #autovacuum_analyze_threshold = 500 # min # of tuple updates before analyze
#autovacuum_vacuum_scale_factor = 0.4 # fraction of rel size before vacuum #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_analyze_scale_factor = 0.2 # fraction of rel size before analyze
#autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for autovac
# -1 means use vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for autovac
# -1 means use vacuum_cost_limit
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.295 2005/08/01 20:31:14 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.296 2005/08/11 21:11:47 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200508011 #define CATALOG_VERSION_NO 200508111
#endif #endif
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/pg_autovacuum.h,v 1.1 2005/07/14 05:13:42 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/pg_autovacuum.h,v 1.2 2005/08/11 21:11:47 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -34,6 +34,8 @@ CATALOG(pg_autovacuum,1248) BKI_WITHOUT_OIDS ...@@ -34,6 +34,8 @@ CATALOG(pg_autovacuum,1248) BKI_WITHOUT_OIDS
float4 vac_scale_factor; /* reltuples scaling factor */ float4 vac_scale_factor; /* reltuples scaling factor */
int4 anl_base_thresh; /* base threshold value */ int4 anl_base_thresh; /* base threshold value */
float4 anl_scale_factor; /* reltuples scaling factor */ 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; } FormData_pg_autovacuum;
/* ---------------- /* ----------------
...@@ -47,13 +49,15 @@ typedef FormData_pg_autovacuum *Form_pg_autovacuum; ...@@ -47,13 +49,15 @@ typedef FormData_pg_autovacuum *Form_pg_autovacuum;
* compiler constants for pg_autovacuum * compiler constants for pg_autovacuum
* ---------------- * ----------------
*/ */
#define Natts_pg_autovacuum 6 #define Natts_pg_autovacuum 8
#define Anum_pg_autovacuum_vacrelid 1 #define Anum_pg_autovacuum_vacrelid 1
#define Anum_pg_autovacuum_enabled 2 #define Anum_pg_autovacuum_enabled 2
#define Anum_pg_autovacuum_vac_base_thresh 3 #define Anum_pg_autovacuum_vac_base_thresh 3
#define Anum_pg_autovacuum_vac_scale_factor 4 #define Anum_pg_autovacuum_vac_scale_factor 4
#define Anum_pg_autovacuum_anl_base_thresh 5 #define Anum_pg_autovacuum_anl_base_thresh 5
#define Anum_pg_autovacuum_anl_scale_factor 6 #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 */ /* There are no preloaded tuples in pg_autovacuum.h */
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Interface to hba.c * Interface to hba.c
* *
* *
* $PostgreSQL: pgsql/src/include/libpq/hba.h,v 1.39 2005/07/29 19:30:08 tgl Exp $ * $PostgreSQL: pgsql/src/include/libpq/hba.h,v 1.40 2005/08/11 21:11:48 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -37,6 +37,7 @@ extern void load_role(void); ...@@ -37,6 +37,7 @@ extern void load_role(void);
extern int hba_getauthmethod(hbaPort *port); extern int hba_getauthmethod(hbaPort *port);
extern int authident(hbaPort *port); extern int authident(hbaPort *port);
extern bool read_pg_database_line(FILE *fp, char *dbname, Oid *dboid, extern bool read_pg_database_line(FILE *fp, char *dbname, Oid *dboid,
Oid *dbtablespace, TransactionId *dbfrozenxid); Oid *dbtablespace, TransactionId *dbfrozenxid,
TransactionId *dbvacuumxid);
#endif /* HBA_H */ #endif /* HBA_H */
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Copyright (c) 2001-2005, PostgreSQL Global Development Group * Copyright (c) 2001-2005, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.34 2005/07/29 19:30:09 tgl Exp $ * $PostgreSQL: pgsql/src/include/pgstat.h,v 1.35 2005/08/11 21:11:49 tgl Exp $
* ---------- * ----------
*/ */
#ifndef PGSTAT_H #ifndef PGSTAT_H
...@@ -367,6 +367,7 @@ extern bool pgstat_collect_blocklevel; ...@@ -367,6 +367,7 @@ extern bool pgstat_collect_blocklevel;
extern void pgstat_init(void); extern void pgstat_init(void);
extern int pgstat_start(void); extern int pgstat_start(void);
extern void pgstat_beterm(int pid); extern void pgstat_beterm(int pid);
extern void pgstat_reset_all(void);
#ifdef EXEC_BACKEND #ifdef EXEC_BACKEND
extern void PgstatBufferMain(int argc, char *argv[]); extern void PgstatBufferMain(int argc, char *argv[]);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/postmaster/autovacuum.h,v 1.1 2005/07/14 05:13:43 tgl Exp $ * $PostgreSQL: pgsql/src/include/postmaster/autovacuum.h,v 1.2 2005/08/11 21:11:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -21,6 +21,8 @@ extern int autovacuum_vac_thresh; ...@@ -21,6 +21,8 @@ extern int autovacuum_vac_thresh;
extern double autovacuum_vac_scale; extern double autovacuum_vac_scale;
extern int autovacuum_anl_thresh; extern int autovacuum_anl_thresh;
extern double autovacuum_anl_scale; extern double autovacuum_anl_scale;
extern int autovacuum_vac_cost_delay;
extern int autovacuum_vac_cost_limit;
/* Status inquiry functions */ /* Status inquiry functions */
extern bool AutoVacuumingActive(void); extern bool AutoVacuumingActive(void);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/tcop/tcopprot.h,v 1.76 2005/07/14 05:13:44 tgl Exp $ * $PostgreSQL: pgsql/src/include/tcop/tcopprot.h,v 1.77 2005/08/11 21:11:50 tgl Exp $
* *
* OLD COMMENTS * OLD COMMENTS
* This file was created so that other c files could get the two * This file was created so that other c files could get the two
...@@ -59,6 +59,7 @@ extern void die(SIGNAL_ARGS); ...@@ -59,6 +59,7 @@ extern void die(SIGNAL_ARGS);
extern void quickdie(SIGNAL_ARGS); extern void quickdie(SIGNAL_ARGS);
extern void authdie(SIGNAL_ARGS); extern void authdie(SIGNAL_ARGS);
extern void StatementCancelHandler(SIGNAL_ARGS); extern void StatementCancelHandler(SIGNAL_ARGS);
extern void FloatExceptionHandler(SIGNAL_ARGS);
extern void prepare_for_client_read(void); extern void prepare_for_client_read(void);
extern void client_read_ended(void); extern void client_read_ended(void);
extern int PostgresMain(int argc, char *argv[], const char *username); extern int PostgresMain(int argc, char *argv[], const char *username);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment