Index: README.pg_buffercache =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/pg_buffercache/README.pg_buffercache,v retrieving revision 1.3 diff -c -r1.3 README.pg_buffercache *** README.pg_buffercache 26 Apr 2006 22:50:17 -0000 1.3 --- README.pg_buffercache 1 Apr 2007 02:17:15 -0000 *************** *** 40,46 **** reldatabase | pg_database.oid | Database for the relation. relblocknumber | | Offset of the page in the relation. isdirty | | Is the page dirty? ! There is one row for each buffer in the shared cache. Unused buffers are shown with all fields null except bufferid. --- 40,46 ---- reldatabase | pg_database.oid | Database for the relation. relblocknumber | | Offset of the page in the relation. isdirty | | Is the page dirty? ! usagecount | | Page LRU count There is one row for each buffer in the shared cache. Unused buffers are shown with all fields null except bufferid. *************** *** 60,79 **** regression=# \d pg_buffercache; View "public.pg_buffercache" ! Column | Type | Modifiers ! ----------------+---------+----------- ! bufferid | integer | ! relfilenode | oid | ! reltablespace | oid | ! reldatabase | oid | ! relblocknumber | bigint | ! isdirty | boolean | View definition: SELECT p.bufferid, p.relfilenode, p.reltablespace, p.reldatabase, ! p.relblocknumber, p.isdirty FROM pg_buffercache_pages() p(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid, relblocknumber bigint, ! isdirty boolean); regression=# SELECT c.relname, count(*) AS buffers FROM pg_class c INNER JOIN pg_buffercache b --- 60,81 ---- regression=# \d pg_buffercache; View "public.pg_buffercache" ! Column | Type | Modifiers ! ----------------+----------+----------- ! bufferid | integer | ! relfilenode | oid | ! reltablespace | oid | ! reldatabase | oid | ! relblocknumber | bigint | ! isdirty | boolean | ! usagecount | smallint | ! View definition: SELECT p.bufferid, p.relfilenode, p.reltablespace, p.reldatabase, ! p.relblocknumber, p.isdirty, p.usagecount FROM pg_buffercache_pages() p(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid, relblocknumber bigint, ! isdirty boolean, usagecount smallint); regression=# SELECT c.relname, count(*) AS buffers FROM pg_class c INNER JOIN pg_buffercache b Index: pg_buffercache.sql.in =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/pg_buffercache/pg_buffercache.sql.in,v retrieving revision 1.4 diff -c -r1.4 pg_buffercache.sql.in *** pg_buffercache.sql.in 26 Apr 2006 22:50:17 -0000 1.4 --- pg_buffercache.sql.in 1 Apr 2007 02:17:15 -0000 *************** *** 12,18 **** CREATE VIEW pg_buffercache AS SELECT P.* FROM pg_buffercache_pages() AS P (bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid, ! relblocknumber int8, isdirty bool); -- Don't want these to be available at public. REVOKE ALL ON FUNCTION pg_buffercache_pages() FROM PUBLIC; --- 12,18 ---- CREATE VIEW pg_buffercache AS SELECT P.* FROM pg_buffercache_pages() AS P (bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid, ! relblocknumber int8, isdirty bool, usagecount int2); -- Don't want these to be available at public. REVOKE ALL ON FUNCTION pg_buffercache_pages() FROM PUBLIC; Index: pg_buffercache_pages.c =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v retrieving revision 1.11 diff -c -r1.11 pg_buffercache_pages.c *** pg_buffercache_pages.c 22 Oct 2006 17:49:21 -0000 1.11 --- pg_buffercache_pages.c 1 Apr 2007 02:17:15 -0000 *************** *** 16,22 **** #include "utils/relcache.h" ! #define NUM_BUFFERCACHE_PAGES_ELEM 6 PG_MODULE_MAGIC; --- 16,22 ---- #include "utils/relcache.h" ! #define NUM_BUFFERCACHE_PAGES_ELEM 7 PG_MODULE_MAGIC; *************** *** 35,40 **** --- 35,41 ---- BlockNumber blocknum; bool isvalid; bool isdirty; + uint16 usagecount; } BufferCachePagesRec; *************** *** 91,96 **** --- 92,99 ---- INT8OID, -1, 0); TupleDescInitEntry(tupledesc, (AttrNumber) 6, "isdirty", BOOLOID, -1, 0); + TupleDescInitEntry(tupledesc, (AttrNumber) 7, "usage_count", + INT2OID, -1, 0); fctx->tupdesc = BlessTupleDesc(tupledesc); *************** *** 126,131 **** --- 129,135 ---- fctx->record[i].reltablespace = bufHdr->tag.rnode.spcNode; fctx->record[i].reldatabase = bufHdr->tag.rnode.dbNode; fctx->record[i].blocknum = bufHdr->tag.blockNum; + fctx->record[i].usagecount = bufHdr->usage_count; if (bufHdr->flags & BM_DIRTY) fctx->record[i].isdirty = true; *************** *** 172,177 **** --- 176,182 ---- nulls[3] = true; nulls[4] = true; nulls[5] = true; + nulls[6] = true; } else { *************** *** 185,190 **** --- 190,197 ---- nulls[4] = false; values[5] = BoolGetDatum(fctx->record[i].isdirty); nulls[5] = false; + values[6] = Int16GetDatum(fctx->record[i].usagecount); + nulls[6] = false; } /* Build and return the tuple. */