Improve comments for [Heap]CheckForSerializableConflictOut().
authorThomas Munro <tmunro@postgresql.org>
Thu, 11 Jun 2020 22:44:32 +0000 (10:44 +1200)
committerThomas Munro <tmunro@postgresql.org>
Thu, 11 Jun 2020 22:55:38 +0000 (10:55 +1200)
Rewrite the documentation of these functions, in light of recent bug fix
commit 5940ffb2.

Back-patch to 13 where the check-for-conflict-out code was split up into
AM-specific and generic parts, and new documentation was added that now
looked wrong.

Reviewed-by: Peter Geoghegan <pg@bowt.ie>
Discussion: https://postgr.es/m/db7b729d-0226-d162-a126-8a8ab2dc4443%40jepsen.io

src/backend/access/heap/heapam.c
src/backend/storage/lmgr/predicate.c

index 9756bf98bde112fbfd773c22781c12daacc34fc8..537913d1bb3e357dfed65b1c31eb71309ce73364 100644 (file)
@@ -8975,15 +8975,13 @@ heap_mask(char *pagedata, BlockNumber blkno)
 
 /*
  * HeapCheckForSerializableConflictOut
- *     We are reading a tuple which has been modified.  If it is visible to
- *     us but has been deleted, that indicates a rw-conflict out.  If it's
- *     not visible and was created by a concurrent (overlapping)
- *     serializable transaction, that is also a rw-conflict out,
+ *     We are reading a tuple.  If it's not visible, there may be a
+ *     rw-conflict out with the inserter.  Otherwise, if it is visible to us
+ *     but has been deleted, there may be a rw-conflict out with the deleter.
  *
  * We will determine the top level xid of the writing transaction with which
- * we may be in conflict, and check for overlap with our own transaction.
- * If the transactions overlap (i.e., they cannot see each other's writes),
- * then we have a conflict out.
+ * we may be in conflict, and ask CheckForSerializableConflictOut() to check
+ * for overlap with our own transaction.
  *
  * 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
index ba93fb199d4e4b8caec107c4f67dc3948de7ca83..d24919f76b67ce3bb5016b024e79d5c16df0d024 100644 (file)
@@ -4037,13 +4037,16 @@ CheckForSerializableConflictOutNeeded(Relation relation, Snapshot snapshot)
 
 /*
  * CheckForSerializableConflictOut
- *     A table AM is reading a tuple that has been modified.  After determining
- *     that it is visible to us, it should call this function with the top
- *     level xid of the writing transaction.
+ *     A table AM is reading a tuple that has been modified.  If it determines
+ *     that the tuple version it is reading is not visible to us, it should
+ *     pass in the top level xid of the transaction that created it.
+ *     Otherwise, if it determines that it is visible to us but it has been
+ *     deleted or there is a newer version available due to an update, it
+ *     should pass in the top level xid of the modifying transaction.
  *
- * This function will check for overlap with our own transaction.  If the
- * transactions overlap (i.e., they cannot see each other's writes), then we
- * have a conflict out.
+ * This function will check for overlap with our own transaction.  If the given
+ * xid is also serializable and the transactions overlap (i.e., they cannot see
+ * each other's writes), then we have a conflict out.
  */
 void
 CheckForSerializableConflictOut(Relation relation, TransactionId xid, Snapshot snapshot)