skip_vacuumed_tuple.diff

application/octet-stream

Filename: skip_vacuumed_tuple.diff
Type: application/octet-stream
Part: 0
Message: Re: BUG #17485: Records missing from Primary Key index when doing REINDEX INDEX CONCURRENTLY

Patch

Format: unified
File+
contrib/amcheck/verify_nbtree.c 22 2
diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
index f23bc1473b..fd67ad4089 100644
--- a/contrib/amcheck/verify_nbtree.c
+++ b/contrib/amcheck/verify_nbtree.c
@@ -2499,16 +2499,36 @@ bt_tuple_present_callback(Relation index, ItemPointer tid, Datum *values,
 	/* Probe Bloom filter -- tuple should be present */
 	if (bloom_lacks_element(state->filter, (unsigned char *) norm,
 							IndexTupleSize(norm)))
+{
+		BlockIdData bid = tid->ip_blkid;
+		Buffer buf = ReadBufferExtended(state->heaprel, MAIN_FORKNUM, BlockIdGetBlockNumber(&bid), RBM_NORMAL, NULL);
+		LockBuffer(buf, BUFFER_LOCK_SHARE);
+		Page page = BufferGetPage(buf);
+
+		if (!ItemIdHasStorage(PageGetItemId(page,tid->ip_posid)))
+		{
+			//elog(WARNING,"tid has no storage");
+			UnlockReleaseBuffer(buf);
+			return;
+		}
+
+		HeapTupleHeader tuphdr = (HeapTupleHeader) PageGetItem(page, PageGetItemId(page,tid->ip_posid));
+
+		LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+		ReleaseBuffer(buf);
 		ereport(ERROR,
 				(errcode(ERRCODE_DATA_CORRUPTED),
-				 errmsg("heap tuple (%u,%u) from table \"%s\" lacks matching index tuple within index \"%s\"",
+				 errmsg("heap tuple (%u,%u) from table \"%s\" lacks matching index tuple within index \"%s\" xmin %d xmax %d",
 						ItemPointerGetBlockNumber(&(itup->t_tid)),
 						ItemPointerGetOffsetNumber(&(itup->t_tid)),
 						RelationGetRelationName(state->heaprel),
-						RelationGetRelationName(state->rel)),
+						RelationGetRelationName(state->rel),
+						HeapTupleHeaderGetRawXmin(tuphdr),
+						HeapTupleHeaderGetRawXmax(tuphdr)),
 				 !state->readonly
 				 ? errhint("Retrying verification using the function bt_index_parent_check() might provide a more specific error.")
 				 : 0));
+	}
 
 	state->heaptuplespresent++;
 	pfree(itup);