Make the temporary directory for pgstat files configurable by the GUC
authorMagnus Hagander
Fri, 15 Aug 2008 08:37:41 +0000 (08:37 +0000)
committerMagnus Hagander
Fri, 15 Aug 2008 08:37:41 +0000 (08:37 +0000)
variable stats_temp_directory, instead of requiring the admin to
mount/symlink the pg_stat_tmp directory manually.

For now the config variable is PGC_POSTMASTER. Room for further improvment
that would allow it to be changed on-the-fly.

doc/src/sgml/config.sgml
doc/src/sgml/monitoring.sgml
src/backend/postmaster/pgstat.c
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample
src/include/pgstat.h

index 6e65251746cbbb3539182adcb438c6d012ad96f2..16a309547b17e004e62e8eb0ac07274c28bd88d9 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
   Server Configuration
@@ -3394,6 +3394,22 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
       
      
 
+     
+      stats_temp_directory (string)
+      
+       stats_temp_directory configuration parameter
+      
+      
+       
+        Sets the directory to store temporary statistics data in. This can be a 
+        path relative to the data directory or an absolute path. The default is
+        pg_stat_tmp. Pointing this at a RAM based filesystem
+        will decrease physical I/O requirements and can lead to increased 
+        performance. This parameter can only be set at server start.
+       
+      
+     
+
      
     
 
index 29a3e1070304eebf3cec41993d4d4714b55e7a10..ab30d87202a01bde58848f32bf628e4ec8a3b586 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  Monitoring Database Activity
@@ -171,8 +171,8 @@ postgres: user database host 
    These files are stored in the pg_stat_tmp subdirectory.
    When the postmaster shuts down, a permanent copy of the statistics
    data is stored in the global subdirectory. For increased
-   performance, it is possible to mount or symlink a RAM based
-   filesystem to the pg_stat_tmp directory.
+   performance, the parameter  can
+   be pointed at a RAM based filesystem, decreasing physical I/O requirements.
   
 
  
index f78e8840b2f39f9d901ceed94a685cd69e6845dc..e09becdeb80df6ed7fbcd7ffd06ab3469c5379fd 100644 (file)
@@ -13,7 +13,7 @@
  *
  * Copyright (c) 2001-2008, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.178 2008/08/05 12:09:30 mha Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.179 2008/08/15 08:37:39 mha Exp $
  * ----------
  */
 #include "postgres.h"
@@ -70,8 +70,6 @@
  */
 #define PGSTAT_STAT_PERMANENT_FILENAME     "global/pgstat.stat"
 #define PGSTAT_STAT_PERMANENT_TMPFILE      "global/pgstat.tmp"
-#define PGSTAT_STAT_FILENAME               "pg_stat_tmp/pgstat.stat"
-#define PGSTAT_STAT_TMPFILE                    "pg_stat_tmp/pgstat.tmp"
 
 /* ----------
  * Timer definitions.
@@ -106,6 +104,13 @@ bool       pgstat_track_counts = false;
 int            pgstat_track_functions = TRACK_FUNC_OFF;
 int            pgstat_track_activity_query_size = 1024;
 
+/* ----------
+ * Built from GUC parameter
+ * ----------
+ */
+char      *pgstat_stat_filename = NULL;
+char      *pgstat_stat_tmpname = NULL;
+
 /*
  * BgWriter global statistics counters (unused in other processes).
  * Stored directly in a stats message structure so it can be sent
@@ -511,7 +516,7 @@ startup_failed:
 void
 pgstat_reset_all(void)
 {
-   unlink(PGSTAT_STAT_FILENAME);
+   unlink(pgstat_stat_filename);
    unlink(PGSTAT_STAT_PERMANENT_FILENAME);
 }
 
@@ -2911,8 +2916,8 @@ pgstat_write_statsfile(bool permanent)
    PgStat_StatFuncEntry *funcentry;
    FILE       *fpout;
    int32       format_id;
-   const char *tmpfile = permanent?PGSTAT_STAT_PERMANENT_TMPFILE:PGSTAT_STAT_TMPFILE;
-   const char *statfile = permanent?PGSTAT_STAT_PERMANENT_FILENAME:PGSTAT_STAT_FILENAME;
+   const char *tmpfile = permanent?PGSTAT_STAT_PERMANENT_TMPFILE:pgstat_stat_tmpname;
+   const char *statfile = permanent?PGSTAT_STAT_PERMANENT_FILENAME:pgstat_stat_filename;
 
    /*
     * Open the statistics temp file to write out the current values.
@@ -3012,7 +3017,7 @@ pgstat_write_statsfile(bool permanent)
    }
 
    if (permanent)
-       unlink(PGSTAT_STAT_FILENAME);
+       unlink(pgstat_stat_filename);
 }
 
 
@@ -3039,7 +3044,7 @@ pgstat_read_statsfile(Oid onlydb, bool permanent)
    FILE       *fpin;
    int32       format_id;
    bool        found;
-   const char *statfile = permanent?PGSTAT_STAT_PERMANENT_FILENAME:PGSTAT_STAT_FILENAME;
+   const char *statfile = permanent?PGSTAT_STAT_PERMANENT_FILENAME:pgstat_stat_filename;
 
    /*
     * The tables will live in pgStatLocalContext.
index 874d20c15f16822b6e157549c90e940248c40519..6cc6dcb7e039adacdefe58c5f5110a7bb590ef08 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut .
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.465 2008/07/23 17:29:53 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.466 2008/08/15 08:37:40 mha Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -164,6 +164,7 @@ static const char *show_tcp_keepalives_interval(void);
 static const char *show_tcp_keepalives_count(void);
 static bool assign_autovacuum_max_workers(int newval, bool doit, GucSource source);
 static bool assign_maxconnections(int newval, bool doit, GucSource source);
+static const char *assign_pgstat_temp_directory(const char *newval, bool doit, GucSource source);
 
 static char *config_enum_get_options(struct config_enum *record, 
                                     const char *prefix, const char *suffix);
@@ -343,6 +344,8 @@ char       *HbaFileName;
 char      *IdentFileName;
 char      *external_pid_file;
 
+char      *pgstat_temp_directory;
+
 int            tcp_keepalives_idle;
 int            tcp_keepalives_interval;
 int            tcp_keepalives_count;
@@ -2466,6 +2469,16 @@ static struct config_string ConfigureNamesString[] =
        NULL, assign_canonical_path, NULL
    },
 
+   {
+       {"stats_temp_directory", PGC_POSTMASTER, STATS_COLLECTOR,
+           gettext_noop("Writes temporary statistics files to the specified directory."),
+           NULL,
+           GUC_SUPERUSER_ONLY
+       },
+       &pgstat_temp_directory,
+       "pg_stat_tmp", assign_pgstat_temp_directory, NULL
+   },
+
    {
        {"default_text_search_config", PGC_USERSET, CLIENT_CONN_LOCALE,
            gettext_noop("Sets default text search configuration."),
@@ -7370,4 +7383,24 @@ assign_autovacuum_max_workers(int newval, bool doit, GucSource source)
    return true;
 }
 
+static const char *
+assign_pgstat_temp_directory(const char *newval, bool doit, GucSource source)
+{
+   if (doit)
+   {
+       if (pgstat_stat_tmpname)
+           free(pgstat_stat_tmpname);
+       if (pgstat_stat_filename)
+           free(pgstat_stat_filename);
+
+       pgstat_stat_tmpname = guc_malloc(FATAL, strlen(newval) + 12);  /* /pgstat.tmp */
+       pgstat_stat_filename = guc_malloc(FATAL, strlen(newval) + 13); /* /pgstat.stat */
+
+       sprintf(pgstat_stat_tmpname, "%s/pgstat.tmp", newval);
+       sprintf(pgstat_stat_filename, "%s/pgstat.stat", newval);
+   }
+
+   return newval;
+}
+
 #include "guc-file.c"
index 552d856ae29e3dbf8b4e9272073fb9b3cc4895e9..063d3ec1c4a851ef5b3334d136a0560d44918dd6 100644 (file)
 #track_functions = none            # none, pl, all
 #track_activity_query_size = 1024
 #update_process_title = on
+#stats_temp_directory = 'pg_stat_tmp'
 
 
 # - Statistics Monitoring -
index fabc5fb4a07cc61ebfa9544c60186645e10d123c..8c2d39e4c5533bbf3364e9a47c64044f7976bbdd 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 2001-2008, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/pgstat.h,v 1.77 2008/06/30 10:58:47 heikki Exp $
+ * $PostgreSQL: pgsql/src/include/pgstat.h,v 1.78 2008/08/15 08:37:40 mha Exp $
  * ----------
  */
 #ifndef PGSTAT_H
@@ -576,6 +576,8 @@ extern bool pgstat_track_activities;
 extern bool pgstat_track_counts;
 extern int pgstat_track_functions;
 extern int pgstat_track_activity_query_size;
+extern char *pgstat_stat_tmpname;
+extern char *pgstat_stat_filename;
 
 /*
  * BgWriter statistics counters are updated directly by bgwriter and bufmgr