]> granicus.if.org Git - postgresql/commitdiff
Fix bugs in manipulation of PgBackendStatus.st_clienthostname.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2014 01:30:11 +0000 (21:30 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2014 01:30:11 +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 0fd44957d96cf6b51032424e8dca44ad92954684..1b8b6c73573c3a4c3a1f6a3176691126f1680163 100644 (file)
@@ -2518,7 +2518,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';
@@ -2531,9 +2535,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 5a03b15c4659524a0265da6f4acdcd2a59b034a5..66e896dc340056e0fa800d39ca3f3fe812945f74 100644 (file)
@@ -724,7 +724,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;