Fix bugs in manipulation of PgBackendStatus.st_clienthostname.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2014 01:30:08 +0000 (21:30 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2014 01:30:34 +0000 (21:30 -0400)
Initialization of this field was not being done according to the
st_changecount protocol (it has to be done within the changecount increment
range, not outside).  And the test to see if the value should be reported
as null was wrong.  Noted while perusing uses of Port.remote_hostname.

This was wrong from the introduction of this code (commit 4a25bc145),
so back-patch to 9.1.

src/backend/postmaster/pgstat.c
src/backend/utils/adt/pgstatfuncs.c

index 3dc280a48d70c58f29e72840b90e9637a455c65a..e355cdee953718cb7a2d1c32525be2d16c2c99b0 100644 (file)
@@ -2581,7 +2581,11 @@ pgstat_bestart(void)
    beentry->st_databaseid = MyDatabaseId;
    beentry->st_userid = userid;
    beentry->st_clientaddr = clientaddr;
-   beentry->st_clienthostname[0] = '\0';
+   if (MyProcPort && MyProcPort->remote_hostname)
+       strlcpy(beentry->st_clienthostname, MyProcPort->remote_hostname,
+               NAMEDATALEN);
+   else
+       beentry->st_clienthostname[0] = '\0';
    beentry->st_waiting = false;
    beentry->st_state = STATE_UNDEFINED;
    beentry->st_appname[0] = '\0';
@@ -2594,9 +2598,6 @@ pgstat_bestart(void)
    beentry->st_changecount++;
    Assert((beentry->st_changecount & 1) == 0);
 
-   if (MyProcPort && MyProcPort->remote_hostname)
-       strlcpy(beentry->st_clienthostname, MyProcPort->remote_hostname, NAMEDATALEN);
-
    /* Update app name to current GUC setting */
    if (application_name)
        pgstat_report_appname(application_name);
index 140704f97ca4d538a879b8e5e37fc2a30f8cb437..bf3084fce67ff37fadf1536e1bf5d3bfe01c8056 100644 (file)
@@ -760,7 +760,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
                        clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
                        values[11] = DirectFunctionCall1(inet_in,
                                               CStringGetDatum(remote_host));
-                       if (beentry->st_clienthostname)
+                       if (beentry->st_clienthostname &&
+                           beentry->st_clienthostname[0])
                            values[12] = CStringGetTextDatum(beentry->st_clienthostname);
                        else
                            nulls[12] = true;