aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2011-03-04 15:37:09 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2011-03-04 15:43:11 +0200
commitee3838b1d35cffec21ca40dbfc409ec40ddf3e28 (patch)
treef3d4cdf58635a1dff609ee3da9c2925f3a8e3a9b
parent12bf602f3fe963a9d155778b9385186c3a0b5ed3 (diff)
downloadpostgresql-ee3838b1d35cffec21ca40dbfc409ec40ddf3e28.tar.gz
postgresql-ee3838b1d35cffec21ca40dbfc409ec40ddf3e28.zip
You must hold a lock on the heap page when you call
CheckForSerializableConflictOut(), because it can set hint bits. YAMAMOTO Takashi
-rw-r--r--src/backend/access/heap/heapam.c4
-rw-r--r--src/backend/storage/lmgr/predicate.c7
2 files changed, 6 insertions, 5 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7dcc6015de9..89697f6ff5e 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -1472,10 +1472,10 @@ heap_fetch(Relation relation,
if (valid)
PredicateLockTuple(relation, tuple);
- LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
-
CheckForSerializableConflictOut(valid, relation, tuple, buffer);
+ LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
+
if (valid)
{
/*
diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c
index aa657fab579..700c0db9278 100644
--- a/src/backend/storage/lmgr/predicate.c
+++ b/src/backend/storage/lmgr/predicate.c
@@ -3366,9 +3366,10 @@ XidIsConcurrent(TransactionId xid)
* If the transactions overlap (i.e., they cannot see each other's writes),
* then we have a conflict out.
*
- * This function should be called just about anywhere in heapam.c that a
- * tuple has been read. There is currently no known reason to call this
- * function from an index AM.
+ * This function should be called just about anywhere in heapam.c where a
+ * tuple has been read. The caller must hold at least a shared lock on the
+ * buffer, because this function might set hint bits on the tuple. There is
+ * currently no known reason to call this function from an index AM.
*/
void
CheckForSerializableConflictOut(const bool visible, const Relation relation,