public inbox for [email protected]help / color / mirror / Atom feed
[PATCH v3] heapdesc: Include information about offset arrays 2+ messages / 2 participants [nested] [flat]
* [PATCH v3] heapdesc: Include information about offset arrays @ 2023-01-09 21:49 Andres Freund <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Andres Freund @ 2023-01-09 21:49 UTC (permalink / raw) --- src/backend/access/rmgrdesc/heapdesc.c | 94 ++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/src/backend/access/rmgrdesc/heapdesc.c b/src/backend/access/rmgrdesc/heapdesc.c index 628f7e82156..f1c4a0e4c64 100644 --- a/src/backend/access/rmgrdesc/heapdesc.c +++ b/src/backend/access/rmgrdesc/heapdesc.c @@ -114,6 +114,37 @@ heap_desc(StringInfo buf, XLogReaderState *record) appendStringInfo(buf, "off %u", xlrec->offnum); } } + +static void +print_offset_array(StringInfo buf, const char *label, OffsetNumber *offsets, int count) +{ + if (count == 0) + return; + appendStringInfo(buf, "%s [", label); + for (int i = 0; i < count; i++) + { + if (i > 0) + appendStringInfoString(buf, ", "); + appendStringInfo(buf, "%u", offsets[i]); + } + appendStringInfoString(buf, "]"); +} + +static void +print_redirect_array(StringInfo buf, const char *label, OffsetNumber *offsets, int count) +{ + if (count == 0) + return; + appendStringInfo(buf, "%s [", label); + for (int i = 0; i < count; i++) + { + if (i > 0) + appendStringInfoString(buf, ", "); + appendStringInfo(buf, "%u->%u", offsets[i * 2], offsets[i * 2 + 1]); + } + appendStringInfoString(buf, "]"); +} + void heap2_desc(StringInfo buf, XLogReaderState *record) { @@ -129,12 +160,48 @@ heap2_desc(StringInfo buf, XLogReaderState *record) xlrec->snapshotConflictHorizon, xlrec->nredirected, xlrec->ndead); + + + if (!XLogRecHasBlockImage(record, 0)) + { + OffsetNumber *end; + OffsetNumber *redirected; + OffsetNumber *nowdead; + OffsetNumber *nowunused; + int nredirected; + int nunused; + Size datalen; + + redirected = (OffsetNumber *) XLogRecGetBlockData(record, 0, &datalen); + + nredirected = xlrec->nredirected; + end = (OffsetNumber *) ((char *) redirected + datalen); + nowdead = redirected + (nredirected * 2); + nowunused = nowdead + xlrec->ndead; + nunused = (end - nowunused); + Assert(nunused >= 0); + + appendStringInfo(buf, " nunused %u", nunused); + print_offset_array(buf, ", unused:", nowunused, nunused); + print_redirect_array(buf, ", redirected:", redirected, nredirected); + print_offset_array(buf, ", dead:", nowdead, xlrec->ndead); + } } else if (info == XLOG_HEAP2_VACUUM) { xl_heap_vacuum *xlrec = (xl_heap_vacuum *) rec; appendStringInfo(buf, "nunused %u", xlrec->nunused); + + if (!XLogRecHasBlockImage(record, 0)) + { + OffsetNumber *nowunused; + Size datalen; + + nowunused = (OffsetNumber *) XLogRecGetBlockData(record, 0, &datalen); + + print_offset_array(buf, " unused:", nowunused, xlrec->nunused); + } } else if (info == XLOG_HEAP2_FREEZE_PAGE) { @@ -142,6 +209,30 @@ heap2_desc(StringInfo buf, XLogReaderState *record) appendStringInfo(buf, "snapshotConflictHorizon %u nplans %u", xlrec->snapshotConflictHorizon, xlrec->nplans); + + if (!XLogRecHasBlockImage(record, 0)) + { + OffsetNumber *offsets; + xl_heap_freeze_plan *plans; + int curoff = 0; + + plans = (xl_heap_freeze_plan *) XLogRecGetBlockData(record, 0, NULL); + offsets = (OffsetNumber *) ((char *) plans + + (xlrec->nplans * + sizeof(xl_heap_freeze_plan))); + + for (int p = 0; p < xlrec->nplans; p++) + { + xl_heap_freeze_plan plan; + + memcpy(&plan, &plans[p], sizeof(xl_heap_freeze_plan)); + + appendStringInfo(buf, "; plan #%d: xmax %u infomask %u infomask2 %u", + p, plan.xmax, plan.t_infomask, plan.t_infomask2); + print_offset_array(buf, ", offsets", offsets + curoff, plan.ntuples); + curoff += plan.ntuples; + } + } } else if (info == XLOG_HEAP2_VISIBLE) { @@ -153,9 +244,12 @@ heap2_desc(StringInfo buf, XLogReaderState *record) else if (info == XLOG_HEAP2_MULTI_INSERT) { xl_heap_multi_insert *xlrec = (xl_heap_multi_insert *) rec; + bool isinit = (XLogRecGetInfo(record) & XLOG_HEAP_INIT_PAGE) != 0; appendStringInfo(buf, "%d tuples flags 0x%02X", xlrec->ntuples, xlrec->flags); + if (!XLogRecHasBlockImage(record, 0) && !isinit) + print_offset_array(buf, " offsets", xlrec->offsets, xlrec->ntuples); } else if (info == XLOG_HEAP2_LOCK_UPDATED) { -- 2.38.0 --atoaxqh2nwpkdneu-- ^ permalink raw reply [nested|flat] 2+ messages in thread
* Re: Revert: Remove useless self-joins *and* -DREALLOCATE_BITMAPSETS make server crash, regress test fail. @ 2024-05-07 22:40 Tom Lane <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Tom Lane @ 2024-05-07 22:40 UTC (permalink / raw) To: David Rowley <[email protected]>; +Cc: Andrew Dunstan <[email protected]>; Richard Guo <[email protected]>; jian he <[email protected]>; PostgreSQL Hackers <[email protected]> David Rowley <[email protected]> writes: > On Wed, 8 May 2024 at 06:20, Tom Lane <[email protected]> wrote: >> I find that Richard's proposed fix makes the core regression tests >> pass, but we still fail check-world. So I'm afraid we need something >> more aggressive, like the attached which makes make_restrictinfo >> copy all its input bitmapsets. Without that, we still have sharing >> of bitmapsets across different RestrictInfos, which seems pretty >> scary given what we now see about the effects of 00b41463c. This >> seems annoyingly expensive, but maybe there's little choice? > We could make the policy copy-on-modify. If you put bms_copy around > the bms_del_member() calls in remove_rel_from_query(), does it pass > then? Didn't test, but that route seems awfully invasive and fragile: how will we find all the places to modify, or ensure that the policy is followed by future patches? regards, tom lane ^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2024-05-07 22:40 UTC | newest] Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2023-01-09 21:49 [PATCH v3] heapdesc: Include information about offset arrays Andres Freund <[email protected]> 2024-05-07 22:40 Re: Revert: Remove useless self-joins *and* -DREALLOCATE_BITMAPSETS make server crash, regress test fail. Tom Lane <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox