From fce43ad9d1f85e793bbcfc21efd796fbe4fa9b2a Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Tue, 18 Sep 2018 18:18:55 -0700 Subject: [PATCH v5 2/3] Add temporary page split debug LOG instrumentation. LOGs details on the new left high key in the event of a leaf page split. This is an easy way to directly observe the effectiveness of suffix truncation as it happens, which was useful during development. The macro DEBUG_SPLITS must be defined (uncommented) for the instrumentation to be enabled. --- src/backend/access/nbtree/nbtinsert.c | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 0cb8bb1816..598e702bf1 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -27,6 +27,11 @@ #include "utils/datum.h" #include "utils/tqual.h" +/* #define DEBUG_SPLITS */ +#ifdef DEBUG_SPLITS +#include "catalog/catalog.h" +#endif + /* Minimum tree height for application of fastpath optimization */ #define BTREE_FASTPATH_MIN_LEVEL 2 #define STACK_SPLIT_POINTS 15 @@ -1287,9 +1292,64 @@ _bt_split(Relation rel, Buffer buf, Buffer cbuf, OffsetNumber firstright, lefthikey = _bt_suffix_truncate(rel, lastleft, item); itemsz = IndexTupleSize(lefthikey); itemsz = MAXALIGN(itemsz); +#ifdef DEBUG_SPLITS + if (IsNormalProcessingMode() && !IsSystemRelation(rel)) + { + TupleDesc itupdesc = RelationGetDescr(rel); + Datum values[INDEX_MAX_KEYS]; + bool isnull[INDEX_MAX_KEYS]; + char *lastleftstr; + char *firstrightstr; + char *newstr; + + index_deform_tuple(lastleft, itupdesc, values, isnull); + lastleftstr = BuildIndexValueDescription(rel, values, isnull); + index_deform_tuple(item, itupdesc, values, isnull); + firstrightstr = BuildIndexValueDescription(rel, values, isnull); + index_deform_tuple(newitem, itupdesc, values, isnull); + newstr = BuildIndexValueDescription(rel, values, isnull); + + elog(LOG, "\"%s\" leaf block %u " + "last left %s first right %s " + "attributes truncated: %u from %u%s new item %s", + RelationGetRelationName(rel), BufferGetBlockNumber(buf), + lastleftstr, firstrightstr, + IndexRelationGetNumberOfKeyAttributes(rel) - BTreeTupleGetNAtts(lefthikey, rel), + IndexRelationGetNumberOfKeyAttributes(rel), + BTreeTupleGetHeapTID(lefthikey) != NULL ? " (heap TID added back)" : "", + newstr); + } +#endif } else + { lefthikey = item; +#ifdef DEBUG_SPLITS + if (IsNormalProcessingMode() && !IsSystemRelation(rel)) + { + TupleDesc itupdesc = RelationGetDescr(rel); + Datum values[INDEX_MAX_KEYS]; + bool isnull[INDEX_MAX_KEYS]; + char *newhighkey; + char *newstr; + + index_deform_tuple(lefthikey, itupdesc, values, isnull); + newhighkey = BuildIndexValueDescription(rel, values, isnull); + index_deform_tuple(newitem, itupdesc, values, isnull); + newstr = BuildIndexValueDescription(rel, values, isnull); + + elog(LOG, "\"%s\" internal block %u " + "new high key %s " + "attributes truncated: %u from %u%s new item %s", + RelationGetRelationName(rel), BufferGetBlockNumber(buf), + newhighkey, + IndexRelationGetNumberOfKeyAttributes(rel) - BTreeTupleGetNAtts(lefthikey, rel), + IndexRelationGetNumberOfKeyAttributes(rel), + BTreeTupleGetHeapTID(lefthikey) != NULL ? " (heap TID added back)" : "", + newstr); + } +#endif + } Assert(BTreeTupleGetNAtts(lefthikey, rel) > 0); Assert(BTreeTupleGetNAtts(lefthikey, rel) <= @@ -1861,6 +1921,11 @@ _bt_findsplitloc(Relation rel, if (firstdiff <= perfectfirstdiff) { +#ifdef DEBUG_SPLITS + elog(LOG, "\"%s\" perfect firstdiff %d returned at point %d out of %d", + RelationGetRelationName(rel), perfectfirstdiff, i, + state.nsplits); +#endif bestfirstdiff = firstdiff; lowsplit = i; break; @@ -1879,6 +1944,10 @@ _bt_findsplitloc(Relation rel, if (state.splits != splits) pfree(state.splits); +#ifdef DEBUG_SPLITS + elog(LOG, "\"%s\" split location %d out of %u", + RelationGetRelationName(rel), finalfirstright, maxoff); +#endif return finalfirstright; } -- 2.17.1