diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 8852326..da9824e 100644 *** a/src/backend/catalog/system_views.sql --- b/src/backend/catalog/system_views.sql *************** CREATE VIEW pg_stat_activity AS *** 342,350 **** S.query_start, S.waiting, S.current_query ! FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_authid U ! WHERE S.datid = D.oid AND ! S.usesysid = U.oid; CREATE VIEW pg_stat_database AS SELECT --- 342,350 ---- S.query_start, S.waiting, S.current_query ! FROM pg_stat_get_activity(NULL) AS S ! LEFT JOIN pg_database D ON (S.datid = D.oid), pg_authid U ! WHERE S.usesysid = U.oid; CREATE VIEW pg_stat_database AS SELECT diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index edb5c80..8c2950c 100644 *** a/src/backend/postmaster/pgstat.c --- b/src/backend/postmaster/pgstat.c *************** pgstat_read_current_status(void) *** 2558,2564 **** */ strcpy(localappname, (char *) beentry->st_appname); localentry->st_appname = localappname; ! strcpy(localactivity, (char *) beentry->st_activity); localentry->st_activity = localactivity; } --- 2558,2567 ---- */ strcpy(localappname, (char *) beentry->st_appname); localentry->st_appname = localappname; ! if (beentry->st_databaseid == InvalidOid) ! WALSndStatus(beentry->st_procpid, localactivity, pgstat_track_activity_query_size); ! else ! strcpy(localactivity, (char *) beentry->st_activity); localentry->st_activity = localactivity; } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index a42e6e8..8e759f9 100644 *** a/src/backend/replication/walsender.c --- b/src/backend/replication/walsender.c *************** WalSndShmemInit(void) *** 892,897 **** --- 892,925 ---- } } + /* Format walsender status as a text */ + void + WALSndStatus(pid_t pid, char *buffer, size_t buflen) + { + int i; + + for (i = 0; i < max_wal_senders; i++) + { + /* use volatile pointer to prevent code rearrangement */ + volatile WalSnd *walsnd = &WalSndCtl->walsnds[i]; + XLogRecPtr recptr; + + if (walsnd->pid != pid) + continue; + + SpinLockAcquire(&walsnd->mutex); + recptr = walsnd->sentPtr; + SpinLockRelease(&walsnd->mutex); + + snprintf(buffer, buflen, "walsender: sent=%X/%X", + recptr.xlogid, recptr.xrecoff); + return; + } + + /* not found */ + buffer[0] = '\0'; + } + /* * This isn't currently used for anything. Monitoring tools might be * interested in the future, and we'll need something like this in the diff --git a/src/include/replication/walsender.h b/src/include/replication/walsender.h index 874959e..8d48998 100644 *** a/src/include/replication/walsender.h --- b/src/include/replication/walsender.h *************** extern int WalSenderMain(void); *** 45,49 **** --- 45,50 ---- extern void WalSndSignals(void); extern Size WalSndShmemSize(void); extern void WalSndShmemInit(void); + extern void WALSndStatus(pid_t pid, char *buffer, size_t buflen); #endif /* _WALSENDER_H */