Avoid incorrectly indicating exclusion constraint wait
authorStephen Frost <sfrost@snowman.net>
Tue, 15 Mar 2016 22:04:39 +0000 (18:04 -0400)
committerStephen Frost <sfrost@snowman.net>
Tue, 15 Mar 2016 22:04:39 +0000 (18:04 -0400)
INSERT ... ON CONFLICT's precheck may have to wait on the outcome of
another insertion, which may or may not itself be a speculative
insertion.  This wait is not necessarily associated with an exclusion
constraint, but was always reported that way in log messages if the wait
happened to involve a tuple that had no speculative token.

Initially discovered through use of ON CONFLICT DO NOTHING, where
spurious references to exclusion constraints in log messages were more
likely.

Patch by Peter Geoghegan.
Reviewed by Julien Rouhaud.

Back-patch to 9.5 where INSERT ... ON CONFLICT was added.

src/backend/executor/execIndexing.c

index 838cee7db078eea62e9df754843697236173a8b0..5d553d51d213352af8cecac316e057f987d25205 100644 (file)
@@ -725,6 +725,7 @@ retry:
        {
                TransactionId xwait;
                ItemPointerData ctid_wait;
+               XLTW_Oper               reason_wait;
                Datum           existing_values[INDEX_MAX_KEYS];
                bool            existing_isnull[INDEX_MAX_KEYS];
                char       *error_new;
@@ -783,13 +784,14 @@ retry:
                          TransactionIdPrecedes(GetCurrentTransactionId(), xwait))))
                {
                        ctid_wait = tup->t_data->t_ctid;
+                       reason_wait = indexInfo->ii_ExclusionOps ?
+                               XLTW_RecheckExclusionConstr : XLTW_InsertIndex;
                        index_endscan(index_scan);
                        if (DirtySnapshot.speculativeToken)
                                SpeculativeInsertionWait(DirtySnapshot.xmin,
                                                                                 DirtySnapshot.speculativeToken);
                        else
-                               XactLockTableWait(xwait, heap, &ctid_wait,
-                                                                 XLTW_RecheckExclusionConstr);
+                               XactLockTableWait(xwait, heap, &ctid_wait, reason_wait);
                        goto retry;
                }