diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2012-11-30 17:02:53 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2012-11-30 17:02:53 -0500 |
commit | b10b1fa86169f6cc8ecb7f7005a67e59d3280e02 (patch) | |
tree | 72299d9c7ec4e978bc45968e3baa7b64abe37616 | |
parent | 244413f0041cf6c55053d83c71ae2ec8fb6224d3 (diff) | |
download | postgresql-b10b1fa86169f6cc8ecb7f7005a67e59d3280e02.tar.gz postgresql-b10b1fa86169f6cc8ecb7f7005a67e59d3280e02.zip |
Take buffer lock while inspecting btree index pages in contrib/pageinspect.
It's not safe to examine a shared buffer without any lock.
-rw-r--r-- | contrib/pageinspect/btreefuncs.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c index c50c5da0bdb..81cfbf1c0f2 100644 --- a/contrib/pageinspect/btreefuncs.c +++ b/contrib/pageinspect/btreefuncs.c @@ -154,9 +154,9 @@ GetBTPageStatistics(BlockNumber blkno, Buffer buffer, BTPageStat * stat) } /* ----------------------------------------------- - * bt_page() + * bt_page_stats() * - * Usage: SELECT * FROM bt_page('t1_pkey', 1); + * Usage: SELECT * FROM bt_page_stats('t1_pkey', 1); * ----------------------------------------------- */ Datum @@ -202,6 +202,7 @@ bt_page_stats(PG_FUNCTION_ARGS) CHECK_RELATION_BLOCK_RANGE(rel, blkno); buffer = ReadBuffer(rel, blkno); + LockBuffer(buffer, BUFFER_LOCK_SHARE); /* keep compiler quiet */ stat.btpo_prev = stat.btpo_next = InvalidBlockNumber; @@ -209,6 +210,9 @@ bt_page_stats(PG_FUNCTION_ARGS) GetBTPageStatistics(blkno, buffer, &stat); + UnlockReleaseBuffer(buffer); + relation_close(rel, AccessShareLock); + /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupleDesc) != TYPEFUNC_COMPOSITE) elog(ERROR, "return type must be a row type"); @@ -245,10 +249,6 @@ bt_page_stats(PG_FUNCTION_ARGS) result = HeapTupleGetDatum(tuple); - ReleaseBuffer(buffer); - - relation_close(rel, AccessShareLock); - PG_RETURN_DATUM(result); } @@ -320,6 +320,7 @@ bt_page_items(PG_FUNCTION_ARGS) CHECK_RELATION_BLOCK_RANGE(rel, blkno); buffer = ReadBuffer(rel, blkno); + LockBuffer(buffer, BUFFER_LOCK_SHARE); /* * We copy the page into local storage to avoid holding pin on the @@ -333,7 +334,7 @@ bt_page_items(PG_FUNCTION_ARGS) uargs->page = palloc(BLCKSZ); memcpy(uargs->page, BufferGetPage(buffer), BLCKSZ); - ReleaseBuffer(buffer); + UnlockReleaseBuffer(buffer); relation_close(rel, AccessShareLock); uargs->offset = FirstOffsetNumber; @@ -464,6 +465,8 @@ bt_metap(PG_FUNCTION_ARGS) errmsg("cannot access temporary tables of other sessions"))); buffer = ReadBuffer(rel, 0); + LockBuffer(buffer, BUFFER_LOCK_SHARE); + page = BufferGetPage(buffer); metad = BTPageGetMeta(page); @@ -490,8 +493,7 @@ bt_metap(PG_FUNCTION_ARGS) result = HeapTupleGetDatum(tuple); - ReleaseBuffer(buffer); - + UnlockReleaseBuffer(buffer); relation_close(rel, AccessShareLock); PG_RETURN_DATUM(result); |