Fix bugs in manipulation of PgBackendStatus.st_clienthostname.
authorTom Lane
Wed, 2 Apr 2014 01:30:14 +0000 (21:30 -0400)
committerTom Lane
Wed, 2 Apr 2014 01:30:14 +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 edad1401e452d8f4821b1ab2a6213ddf567d310c..214d1849a133e65709c4cba7c121f7ac6f798feb 100644 (file)
@@ -2458,7 +2458,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';
@@ -2471,9 +2475,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 97a4754e924a27820753bf06a1c1da6b670ab36d..4d3f62e508d0fe95e803542e7b944891f0935ab5 100644 (file)
@@ -723,7 +723,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;