aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-11-30 17:02:53 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2012-11-30 17:02:53 -0500
commitb10b1fa86169f6cc8ecb7f7005a67e59d3280e02 (patch)
tree72299d9c7ec4e978bc45968e3baa7b64abe37616
parent244413f0041cf6c55053d83c71ae2ec8fb6224d3 (diff)
downloadpostgresql-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.c20
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);