From 49967da65aec970fcda123acc681f1df5d70bfc6 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 16 Aug 2020 12:57:01 -0700 Subject: [PATCH] Make vacuum a bit more verbose to debug BF failure. This is temporary. While possibly some more error checking / debugging in this path would be a good thing, it'll not look exactly like this. Discussion: https://postgr.es/m/20200816181604.l54m6kss5ntd6xow@alap3.anarazel.de --- src/backend/access/heap/heapam.c | 11 ++++++++++- src/backend/access/heap/vacuumlazy.c | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 9b5f417eac..8eb276e464 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -6048,7 +6048,16 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, TransactionIdIsInProgress(members[i].xid)) { /* running locker cannot possibly be older than the cutoff */ - Assert(!TransactionIdPrecedes(members[i].xid, cutoff_xid)); + if (TransactionIdPrecedes(members[i].xid, cutoff_xid)) + { + /* temporary on-bf debugging */ + elog(PANIC, "too old alive locker: multi: %u, member xid: %u, memb-current: %d, memb-progress: %d, cutoff: %u, cutoff-multi: %u, relfrozenxid: %u, relminmxid: %u", + multi, members[i].xid, + TransactionIdIsCurrentTransactionId(members[i].xid), + TransactionIdIsInProgress(members[i].xid), + cutoff_xid, cutoff_multi, + relfrozenxid, relminmxid); + } newmembers[nnewmembers++] = members[i]; has_lockers = true; } diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 44e2224dd5..03c8e1ff7e 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -1350,7 +1350,14 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, if (HeapTupleIsHotUpdated(&tuple) || HeapTupleIsHeapOnly(&tuple) || params->index_cleanup == VACOPT_TERNARY_DISABLED) + { + /* temporary on-bf debugging */ + elog(LOG, "treating dead HOT tuple (updated %d, heap only: %d, index cleanup: %d) as alive", + HeapTupleIsHotUpdated(&tuple), HeapTupleIsHeapOnly(&tuple), + params->index_cleanup == VACOPT_TERNARY_DISABLED); + nkeep += 1; + } else tupgone = true; /* we can delete the tuple */ all_visible = false;