diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-03-04 15:37:09 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-03-04 15:43:11 +0200 |
commit | ee3838b1d35cffec21ca40dbfc409ec40ddf3e28 (patch) | |
tree | f3d4cdf58635a1dff609ee3da9c2925f3a8e3a9b | |
parent | 12bf602f3fe963a9d155778b9385186c3a0b5ed3 (diff) | |
download | postgresql-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.c | 4 | ||||
-rw-r--r-- | src/backend/storage/lmgr/predicate.c | 7 |
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, |