walsender_activity-20100618.patch
application/octet-stream
Filename: walsender_activity-20100618.patch
Type: application/octet-stream
Part: 0
Message:
system views for walsender activity
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/catalog/system_views.sql | 0 | 0 |
| src/backend/postmaster/pgstat.c | 0 | 0 |
| src/backend/replication/walsender.c | 0 | 0 |
| src/include/replication/walsender.h | 0 | 0 |
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 */