Re: Proposal: knowing detail of config files via SQL - Mailing list pgsql-hackers

From Sawada Masahiko
Subject Re: Proposal: knowing detail of config files via SQL
Date
Msg-id CAD21AoAzw-43x5wGCh+jCPxiGxUhZf3HPmf5RftJtOTbBMdSbw@mail.gmail.com
Whole thread Raw
In response to Re: Proposal: knowing detail of config files via SQL  (David Steele <david@pgmasters.net>)
Responses Re: Proposal: knowing detail of config files via SQL
Re: Proposal: knowing detail of config files via SQL
List pgsql-hackers
On Sat, Apr 25, 2015 at 3:40 AM, David Steele <david@pgmasters.net> wrote:
> On 4/4/15 9:21 AM, Sawada Masahiko wrote:
>> I added documentation changes to patch is attached.
>> Also I tried to use memory context for allocation of guc_file_variable
>> in TopMemoryContext,
>> but it was failed access after received SIGHUP.
> Below is my review of the v5 patch:

Thank you for your review comment!
The latest patch is attached.

> diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
> + <sect1 id="view-pg-file-settings">
> +  <title><structname>pg_file_settings</structname></title>
> +
> +  <indexterm zone="view-pg-file-settings">
> +   <primary>pg_file_settings</primary>
> +  </indexterm>
> +
> +  <para>
> +   The view <structname>pg_file_settings</structname> provides confirm
> parameters via SQL,
> +   which is written in configuration file. This view can be update by
> reloading configration file.
> +  </para>
>
> Perhaps something like:
>
>   <para>
>    The view <structname>pg_file_settings</structname> provides access to
> run-time parameters
>    that are defined in configuration files via SQL.  In contrast to
>    <structname>pg_settings</structname> a row is provided for each
> occurrence
>    of the parameter in a configuration file.  This is helpful for
> discovering why one value
>    may have been used in preference to another when the parameters were
> loaded.
>   </para>
>
> +  <table>
> +   <title><structname>pg_file_settings</> Columns</title>
> +
> +  <tgroup cols="3">
> +   <thead>
> +    <row>
> +     <entry>Name</entry>
> +     <entry>Type</entry>
> +     <entry>Description</entry>
> +    </row>
> +   </thead>
> +   <tbody>
> +    <row>
> +     <entry><structfield>sourcefile</structfield></entry>
> +     <entry><structfield>text</structfield></entry>
> +     <entry>A path of configration file</entry>
>
> From pg_settings:
>
>       <entry>Configuration file the current value was set in (null for
>       values set from sources other than configuration files, or when
>       examined by a non-superuser);
>       helpful when using <literal>include</> directives in configuration
> files</entry>
>
> +    </row>
> +    <row>
> +     <entry><structfield>sourceline</structfield></entry>
> +     <entry><structfield>integer</structfield></entry>
> +     <entry>The line number in configuration file</entry>
>
> From pg_settings:
>
>       <entry>Line number within the configuration file the current value was
>       set at (null for values set from sources other than configuration
> files,
>       or when examined by a non-superuser)
>       </entry>
>
>
> +    </row>
> +    <row>
> +     <entry><structfield>name</structfield></entry>
> +     <entry><structfield>text</structfield></entry>
> +     <entry>Parameter name in configuration file</entry>
>
> From pg_settings:
>
>       <entry>Run-time configuration parameter name</entry>
>
> +    </row>
> +    <row>
> +     <entry><structfield>setting</structfield></entry>
> +     <entry><structfield>text</structfield></entry>
> +     <entry>Value of the parameter in configuration file</entry>
> +    </row>
> +   </tbody>
> +  </tgroup>
> + </table>
> +
> +</sect1>

The documentation is updated based on your suggestion.

> diff --git a/src/backend/utils/misc/guc-file.l
> b/src/backend/utils/misc/guc-file.l
> @@ -342,6 +345,42 @@ ProcessConfigFile(GucContext context)
> +        guc_array = guc_file_variables;
> +        for (item = head; item; item = item->next, guc_array++)
> +        {
> +            free(guc_array->name);
> +            free(guc_array->value);
> +            free(guc_array->filename);
>
> There's an issue freeing these when calling pg_reload_conf():

Fix.

> postgres=# alter system set max_connections = 100;
> ALTER SYSTEM
> postgres=# select * from pg_reload_conf();
> LOG:  received SIGHUP, reloading configuration files
>  pg_reload_conf
> ----------------
>  t
> (1 row)
>
> postgres=# postgres(25078,0x7fff747b2300) malloc: *** error for object
> 0x424d380044: pointer being freed was not allocated
> *** set a breakpoint in malloc_error_break to debug
>
> Of course a config reload can't change max_connections, but I wouldn't
> expect it to crash, either.
>
> +            guc_array->sourceline = -1;
>
> I can't see the need for this since it is reassigned further down.

Fix.

> --
>
> Up-thread David J had recommended an ordering column (or seqno) that
> would provide the order in which the settings were loaded.  I think this
> would give valuable information that can't be gleaned from the line
> numbers alone.
>
> Personally I think it would be fine to start from 1 and increment for
> each setting found, rather than rank within a setting.  If the user
> wants per setting ranking that's what SQL is for.  So the output would
> look something like:
>
>        sourcefile         | sourceline | seqno |      name       |  setting
> --------------------------+------------+-------+-----------------+-----------
>  /db/postgresql.conf      |         64 |     1 | max_connections | 100
>  /db/postgresql.conf      |        116 |     2 | shared_buffers  | 128MB
>  /db/postgresql.conf      |        446 |     3 | log_timezone    |
> US/Eastern
>  /db/postgresql.auto.conf |          3 |     4 | max_connections | 200
>

Yep, I agree with you.
Added seqno column into pg_file_settings view.

Regards,

-------
Sawada Masahiko

Attachment

pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: Re: INSERT ... ON CONFLICT UPDATE/IGNORE 4.0, parser/executor stuff
Next
From: Andrew Dunstan
Date:
Subject: Re: forward vs backward slashes in msvc build code