mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-03 04:37:21 +02:00
* A few bug fixes * fixes solaris compile and crash issue * decouple vacuum analyze and analyze thresholds * detach from tty (dameonize) * improved logging layout * more conservative default configuration * improved, expanded and updated README please apply and 1st convenience, or before code freeze which ever comes first :-) At this point I think I have brought pg_autovacuum and its client side design as far as I think it should go. It works, keeping file sizes in check, helps performance and give the administrator a fair amount flexibility in configuring it. Next up is to do the FSM based design that is integrated into the back end. p.s. Thanks to Christopher Browne for his help. Matthew T. O'Connor
114 lines
4.4 KiB
C
114 lines
4.4 KiB
C
/* pg_autovacuum.h
|
|
* Header file for pg_autovacuum.c
|
|
* (c) 2003 Matthew T. O'Connor
|
|
*/
|
|
|
|
#include "postgres_fe.h"
|
|
|
|
#include <unistd.h>
|
|
#ifdef __GLIBC__
|
|
#include <getopt.h>
|
|
#endif
|
|
#include <sys/time.h>
|
|
|
|
/* These next two lines are correct when pg_autovaccum is compiled
|
|
from within the postgresql source tree */
|
|
#include "libpq-fe.h"
|
|
#include "lib/dllist.h"
|
|
/* Had to change the last two lines to compile on
|
|
Redhat outside of postgresql source tree */
|
|
/*
|
|
#include "/usr/include/libpq-fe.h"
|
|
#include "/usr/include/pgsql/server/lib/dllist.h"
|
|
*/
|
|
|
|
#define AUTOVACUUM_DEBUG 1
|
|
#define VACBASETHRESHOLD 1000
|
|
#define VACSCALINGFACTOR 2
|
|
#define SLEEPBASEVALUE 300
|
|
#define SLEEPSCALINGFACTOR 2
|
|
#define UPDATE_INTERVAL 2
|
|
|
|
/* these two constants are used to tell update_table_stats what operation we just perfomred */
|
|
#define VACUUM_ANALYZE 0
|
|
#define ANALYZE_ONLY 1
|
|
|
|
#define TABLE_STATS_ALL "select a.relfilenode,a.relname,a.relnamespace,a.relpages,a.reltuples,b.schemaname,b.n_tup_ins,b.n_tup_upd,b.n_tup_del from pg_class a, pg_stat_all_tables b where a.relfilenode=b.relid"
|
|
#define TABLE_STATS_USER "select a.relfilenode,a.relname,a.relnamespace,a.relpages,a.reltuples,b.schemaname,b.n_tup_ins,b.n_tup_upd,b.n_tup_del from pg_class a, pg_stat_user_tables b where a.relfilenode=b.relid"
|
|
#define FRONTEND
|
|
#define PAGES_QUERY "select relfilenode,reltuples,relpages from pg_class where relfilenode=%i"
|
|
#define FROZENOID_QUERY "select oid,age(datfrozenxid) from pg_database where datname = 'template1'"
|
|
#define FROZENOID_QUERY2 "select oid,datname,age(datfrozenxid) from pg_database where datname!='template0'"
|
|
|
|
/* define cmd_args stucture */
|
|
struct cmdargs
|
|
{
|
|
int vacuum_base_threshold, analyze_base_threshold, sleep_base_value, debug, daemonize;
|
|
float vacuum_scaling_factor, analyze_scaling_factor, sleep_scaling_factor;
|
|
char *user, *password, *host, *logfile, *port;
|
|
};
|
|
typedef struct cmdargs cmd_args;
|
|
|
|
/* define cmd_args as global so we can get to them everywhere */
|
|
cmd_args *args;
|
|
|
|
/* Might need to add a time value for last time the whold database was vacuumed.
|
|
I think we need to guarantee this happens approx every 1Million TX's */
|
|
struct dbinfo
|
|
{
|
|
int oid, age;
|
|
int analyze_threshold, vacuum_threshold; /* Use these as defaults for table thresholds */
|
|
PGconn *conn;
|
|
char *dbname, *username, *password;
|
|
Dllist *table_list;
|
|
};
|
|
typedef struct dbinfo db_info;
|
|
|
|
struct tableinfo
|
|
{
|
|
char *schema_name, *table_name;
|
|
int relfilenode, reltuples, relpages;
|
|
long analyze_threshold, vacuum_threshold;
|
|
long CountAtLastAnalyze; /* equal to: inserts + updates as of the last analyze or initial values at startup */
|
|
long CountAtLastVacuum; /* equal to: deletes + updates as of the last vacuum or initial values at startup */
|
|
long curr_analyze_count, curr_vacuum_count; /* Latest values from stats system */
|
|
db_info *dbi; /* pointer to the database that this table belongs to */
|
|
};
|
|
typedef struct tableinfo tbl_info;
|
|
|
|
/* Functions for dealing with command line arguements */
|
|
static cmd_args *get_cmd_args (int argc, char *argv[]);
|
|
static void print_cmd_args (void);
|
|
static void free_cmd_args (void);
|
|
static void usage (void);
|
|
|
|
/* Functions for managing database lists */
|
|
static Dllist *init_db_list (void);
|
|
static db_info *init_dbinfo (char *dbname, int oid, int age);
|
|
static void update_db_list (Dllist * db_list);
|
|
static void remove_db_from_list (Dlelem * db_to_remove);
|
|
static void print_db_info (db_info * dbi, int print_table_list);
|
|
static void print_db_list (Dllist * db_list, int print_table_lists);
|
|
static int xid_wraparound_check (db_info * dbi);
|
|
static void free_db_list (Dllist * db_list);
|
|
|
|
/* Functions for managing table lists */
|
|
static tbl_info *init_table_info (PGresult * conn, int row, db_info *dbi);
|
|
static void update_table_list (db_info * dbi);
|
|
static void remove_table_from_list (Dlelem * tbl_to_remove);
|
|
static void print_table_list (Dllist * tbl_node);
|
|
static void print_table_info (tbl_info * tbl);
|
|
static void update_table_thresholds (db_info * dbi, tbl_info * tbl, int vacuum_type);
|
|
static void free_tbl_list (Dllist * tbl_list);
|
|
|
|
/* A few database helper functions */
|
|
static int check_stats_enabled (db_info * dbi);
|
|
static PGconn *db_connect (db_info * dbi);
|
|
static void db_disconnect (db_info * dbi);
|
|
static PGresult *send_query (const char *query, db_info * dbi);
|
|
static char *query_table_stats (db_info * dbi);
|
|
|
|
/* Other Generally needed Functions */
|
|
static void daemonize(void);
|
|
static void log_entry (const char *logentry);
|