]> granicus.if.org Git - postgresql/commitdiff
Cope with heap_fetch failure while locking an update chain
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 27 Nov 2013 20:45:25 +0000 (17:45 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 28 Nov 2013 14:54:25 +0000 (11:54 -0300)
The reason for the fetch failure is that the tuple was removed because
it was dead; so the failure is innocuous and can be ignored.  Moreover,
there's no need for further work and we can return success to the caller
immediately.  EvalPlanQualFetch is doing something very similar to this
already.

Report and test case from Andres Freund in
20131124000203.GA4403@alap2.anarazel.de

src/backend/access/heap/heapam.c

index b1b3add38d96c4a301ab11e96378857be31eaa5d..8e1a3bff1920e1333a4a4106202b63050971a3d8 100644 (file)
@@ -4807,7 +4807,16 @@ heap_lock_updated_tuple_rec(Relation rel, ItemPointer tid, TransactionId xid,
                ItemPointerCopy(&tupid, &(mytup.t_self));
 
                if (!heap_fetch(rel, SnapshotAny, &mytup, &buf, false, NULL))
-                       elog(ERROR, "unable to fetch updated version of tuple");
+               {
+                       /*
+                        * if we fail to find the updated version of the tuple, it's
+                        * because it was vacuumed/pruned away after its creator
+                        * transaction aborted.  So behave as if we got to the end of the
+                        * chain, and there's no further tuple to lock: return success to
+                        * caller.
+                        */
+                       return HeapTupleMayBeUpdated;
+               }
 
 l4:
                CHECK_FOR_INTERRUPTS();