From 0a37ceea53736e39d0f1af72ec9bc07d98833370 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Fri, 15 Dec 2017 14:05:16 -0800 Subject: [PATCH] Promote "HOT parent tuple" elog to an ereport. Commit d70cf811, from 2014, promoted an assert within IndexBuildHeapScan() (and another similar assert) to a "can't happen" elog() error, in order to detect when a parent tuple cannot be found for some heap-only tuple during CREATE INDEX/REINDEX. When the error is raised, it indicates heap corruption. This has proven useful as a corruption smoke-test while investigating recent corruption-inducing bugs in pruning/freezing. This commit promotes those elog() errors to ereport() errors. The errors are emitted with ereport rather than elog, despite being "should never happen" messages, so a proper error code is emitted. To avoid superfluous translations, mark messages as internal. This is done primarily for the benefit of tools like amcheck, that may want to piggy-back on IndexBuildHeapScan() to perform integrity checking. It's worth spelling out the nature of the problem for users of these tools. Author: Peter Geoghegan Reviewed-By: Andres Freund Backpatch: 9.3- --- src/backend/catalog/index.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 0125c18..e43482d 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -2595,9 +2595,12 @@ IndexBuildHeapRangeScan(Relation heapRelation, offnum = ItemPointerGetOffsetNumber(&heapTuple->t_self); if (!OffsetNumberIsValid(root_offsets[offnum - 1])) - elog(ERROR, "failed to find parent tuple for heap-only tuple at (%u,%u) in table \"%s\"", - ItemPointerGetBlockNumber(&heapTuple->t_self), - offnum, RelationGetRelationName(heapRelation)); + ereport(ERROR, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg_internal("failed to find parent tuple for heap-only tuple at (%u,%u) in table \"%s\"", + ItemPointerGetBlockNumber(&heapTuple->t_self), + offnum, + RelationGetRelationName(heapRelation)))); ItemPointerSetOffsetNumber(&rootTuple.t_self, root_offsets[offnum - 1]); @@ -3060,10 +3063,12 @@ validate_index_heapscan(Relation heapRelation, { root_offnum = root_offsets[root_offnum - 1]; if (!OffsetNumberIsValid(root_offnum)) - elog(ERROR, "failed to find parent tuple for heap-only tuple at (%u,%u) in table \"%s\"", - ItemPointerGetBlockNumber(heapcursor), - ItemPointerGetOffsetNumber(heapcursor), - RelationGetRelationName(heapRelation)); + ereport(ERROR, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg_internal("failed to find parent tuple for heap-only tuple at (%u,%u) in table \"%s\"", + ItemPointerGetBlockNumber(heapcursor), + ItemPointerGetOffsetNumber(heapcursor), + RelationGetRelationName(heapRelation)))); ItemPointerSetOffsetNumber(&rootTuple, root_offnum); } -- 2.7.4