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 7acea74eb12715ec91eb1af1ed8e675e338838a8..c171c4b4cfb3487b9b476d2691f47fdb9d3ccebb 100644 (file)
@@ -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 705b6a94596497aceef29a6dd049c4d3be88950f..86dba8880872c820fca48ce19959e1bcb458b95a 100644 (file)
@@ -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 43f563d5174e635daf83ceb006be24b7c95f1b62..23b803539caaf7f9466cfb527c75bdb77c78055f 100644 (file)
@@ -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 1615119b6d4859ce62f3009ca836626729673707..1274834b81970cf3e6a2609f91fecf3ca6b94fbe 100644 (file)
@@ -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 8abcc2f26496e70104a2008dc15be41f4ea7d5a1..e6b1ef01092647903dd2fcf80bcd92d481d2332a 100644 (file)
@@ -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