Make local copy of client hostnames in backend status array.
authorHeikki Linnakangas <[email protected]>
Wed, 11 Apr 2018 20:39:48 +0000 (23:39 +0300)
committerHeikki Linnakangas <[email protected]>
Wed, 11 Apr 2018 20:39:48 +0000 (23:39 +0300)
The other strings, application_name and query string, were snapshotted to
local memory in pgstat_read_current_status(), but we forgot to do that for
client hostnames. As a result, the client hostname would appear to change in
the local copy, if the client disconnected.

Backpatch to all supported versions.

Author: Edmund Horner
Reviewed-by: Michael Paquier
Discussion: https://www.postgresql.org/message-id/CAMyN-kA7aOJzBmrYFdXcc7Z0NmW%2B5jBaf_m%3D_-77uRNyKC9r%3DA%40mail.gmail.com

src/backend/postmaster/pgstat.c

index 96ba2163878ed31047aa4a95faf59773101fc4bb..2c224ab97d836e8fe205d91aa8348512c11d9edb 100644 (file)
@@ -3224,6 +3224,7 @@ pgstat_read_current_status(void)
        LocalPgBackendStatus *localtable;
        LocalPgBackendStatus *localentry;
        char       *localappname,
+                          *localclienthostname,
                           *localactivity;
 #ifdef USE_SSL
        PgBackendSSLStatus *localsslstatus;
@@ -3242,6 +3243,9 @@ pgstat_read_current_status(void)
        localappname = (char *)
                MemoryContextAlloc(pgStatLocalContext,
                                                   NAMEDATALEN * NumBackendStatSlots);
+       localclienthostname = (char *)
+               MemoryContextAlloc(pgStatLocalContext,
+                                                  NAMEDATALEN * NumBackendStatSlots);
        localactivity = (char *)
                MemoryContextAlloc(pgStatLocalContext,
                                                   pgstat_track_activity_query_size * NumBackendStatSlots);
@@ -3282,6 +3286,8 @@ pgstat_read_current_status(void)
                                 */
                                strcpy(localappname, (char *) beentry->st_appname);
                                localentry->backendStatus.st_appname = localappname;
+                               strcpy(localclienthostname, (char *) beentry->st_clienthostname);
+                               localentry->backendStatus.st_clienthostname = localclienthostname;
                                strcpy(localactivity, (char *) beentry->st_activity_raw);
                                localentry->backendStatus.st_activity_raw = localactivity;
                                localentry->backendStatus.st_ssl = beentry->st_ssl;
@@ -3313,6 +3319,7 @@ pgstat_read_current_status(void)
 
                        localentry++;
                        localappname += NAMEDATALEN;
+                       localclienthostname += NAMEDATALEN;
                        localactivity += pgstat_track_activity_query_size;
 #ifdef USE_SSL
                        localsslstatus++;