@@ -3814,7 +3814,7 @@ FlagRWConflict(SERIALIZABLEXACT *reader, SERIALIZABLEXACT *writer)
38143814SetRWConflict (reader ,writer );
38153815}
38163816
3817- /*
3817+ /*----------------------------------------------------------------------------
38183818 * We are about to add a RW-edge to the dependency graph - check that we don't
38193819 * introduce a dangerous structure by doing so, and abort one of the
38203820 * transactions if so.
@@ -3823,13 +3823,14 @@ FlagRWConflict(SERIALIZABLEXACT *reader, SERIALIZABLEXACT *writer)
38233823 * in the dependency graph:
38243824 *
38253825 *Tin ------> Tpivot ------> Tout
3826- * rw rw
3826+ * rw rw
38273827 *
38283828 * Furthermore, Tout must commit first.
38293829 *
38303830 * One more optimization is that if Tin is declared READ ONLY (or commits
38313831 * without writing), we can only have a problem if Tout committed before Tin
38323832 * acquired its snapshot.
3833+ *----------------------------------------------------------------------------
38333834 */
38343835static void
38353836OnConflict_CheckForSerializationFailure (const SERIALIZABLEXACT * reader ,
@@ -3842,32 +3843,34 @@ OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
38423843
38433844failure = false;
38443845
3845- /*
3846+ /*------------------------------------------------------------------------
38463847 * Check for already-committed writer with rw-conflict out flagged
38473848 * (conflict-flag on W means that T2 committed before W):
38483849 *
38493850 *R ------> W ------> T2
3850- *rw rw
3851+ *rw rw
38513852 *
38523853 * That is a dangerous structure, so we must abort. (Since the writer
38533854 * has already committed, we must be the reader)
3855+ *------------------------------------------------------------------------
38543856 */
38553857if (SxactIsCommitted (writer )
38563858&& (SxactHasConflictOut (writer )|| SxactHasSummaryConflictOut (writer )))
38573859failure = true;
38583860
3859- /*
3861+ /*------------------------------------------------------------------------
38603862 * Check whether the writer has become a pivot with an out-conflict
38613863 * committed transaction (T2), and T2 committed first:
38623864 *
38633865 *R ------> W ------> T2
3864- *rw rw
3866+ *rw rw
38653867 *
38663868 * Because T2 must've committed first, there is no anomaly if:
38673869 * - the reader committed before T2
38683870 * - the writer committed before T2
38693871 * - the reader is a READ ONLY transaction and the reader was concurrent
38703872 * with T2 (= reader acquired its snapshot before T2 committed)
3873+ *------------------------------------------------------------------------
38713874 */
38723875if (!failure )
38733876{
@@ -3891,7 +3894,7 @@ OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
38913894&& (!SxactIsCommitted (writer )
38923895|| t2 -> commitSeqNo <=writer -> commitSeqNo )
38933896&& (!SxactIsReadOnly (reader )
3894- || t2 -> commitSeqNo <=reader -> SeqNo .lastCommitBeforeSnapshot ))
3897+ || t2 -> commitSeqNo <=reader -> SeqNo .lastCommitBeforeSnapshot ))
38953898{
38963899failure = true;
38973900break ;
@@ -3903,16 +3906,17 @@ OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
39033906}
39043907}
39053908
3906- /*
3909+ /*------------------------------------------------------------------------
39073910 * Check whether the reader has become a pivot with a committed writer:
39083911 *
39093912 *T0 ------> R ------> W
3910- * rw rw
3913+ * rw rw
39113914 *
39123915 * Because W must've committed first for an anomaly to occur, there is no
39133916 * anomaly if:
39143917 * - T0 committed before the writer
39153918 * - T0 is READ ONLY, and overlaps the writer
3919+ *------------------------------------------------------------------------
39163920 */
39173921if (!failure && SxactIsCommitted (writer )&& !SxactIsReadOnly (reader ))
39183922{
@@ -3934,7 +3938,7 @@ OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
39343938&& (!SxactIsCommitted (t0 )
39353939|| t0 -> commitSeqNo >=writer -> commitSeqNo )
39363940&& (!SxactIsReadOnly (t0 )
3937- || t0 -> SeqNo .lastCommitBeforeSnapshot >=writer -> commitSeqNo ))
3941+ || t0 -> SeqNo .lastCommitBeforeSnapshot >=writer -> commitSeqNo ))
39383942{
39393943failure = true;
39403944break ;
@@ -3950,8 +3954,8 @@ OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
39503954{
39513955/*
39523956 * We have to kill a transaction to avoid a possible anomaly from
3953- * occurring. If the writer is us, we can just ereport() to cause
3954- *a transaction abort. Otherwise we flag the writer for termination,
3957+ * occurring. If the writer is us, we can just ereport() to cause a
3958+ * transaction abort. Otherwise we flag the writer for termination,
39553959 * causing it to abort when it tries to commit. However, if the writer
39563960 * is a prepared transaction, already prepared, we can't abort it
39573961 * anymore, so we have to kill the reader instead.
@@ -3962,7 +3966,7 @@ OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
39623966ereport (ERROR ,
39633967(errcode (ERRCODE_T_R_SERIALIZATION_FAILURE ),
39643968errmsg ("could not serialize access due to read/write dependencies among transactions" ),
3965- errdetail ("Cancelled on identification as a pivot, during write." ),
3969+ errdetail ("Cancelled on identification as a pivot, during write." ),
39663970errhint ("The transaction might succeed if retried." )));
39673971}
39683972else if (SxactIsPrepared (writer ))