]> granicus.if.org Git - postgresql/commitdiff
Make the temporary directory for pgstat files configurable by the GUC
authorMagnus Hagander <magnus@hagander.net>
Fri, 15 Aug 2008 08:37:41 +0000 (08:37 +0000)
committerMagnus Hagander <magnus@hagander.net>
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 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.184 2008/07/18 17:33:17 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.185 2008/08/15 08:37:41 mha Exp $ -->
 
 <chapter Id="runtime-config">
   <title>Server Configuration</title>
@@ -3394,6 +3394,22 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-stats-temp-directory" xreflabel="stats_temp_directory">
+      <term><varname>stats_temp_directory</varname> (<type>string</type>)</term>
+      <indexterm>
+       <primary><varname>stats_temp_directory</> configuration parameter</primary>
+      </indexterm>
+      <listitem>
+       <para>
+        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
+        <filename>pg_stat_tmp</filename>. 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.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
 
index 29a3e1070304eebf3cec41993d4d4714b55e7a10..ab30d87202a01bde58848f32bf628e4ec8a3b586 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.61 2008/08/05 12:09:30 mha Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.62 2008/08/15 08:37:41 mha Exp $ -->
 
 <chapter id="monitoring">
  <title>Monitoring Database Activity</title>
@@ -171,8 +171,8 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
    These files are stored in the <filename>pg_stat_tmp</filename> subdirectory.
    When the postmaster shuts down, a permanent copy of the statistics
    data is stored in the <filename>global</filename> subdirectory. For increased
-   performance, it is possible to mount or symlink a RAM based
-   filesystem to the <filename>pg_stat_tmp</filename> directory.
+   performance, the parameter <xref linkend="guc-stats-temp-directory"> can
+   be pointed at a RAM based filesystem, decreasing physical I/O requirements.
   </para>
 
  </sect2>
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 <peter_e@gmx.net>.
  *
  * 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