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 */