Re: new heapcheck contrib module - Mailing list pgsql-hackers
From | Amul Sul |
---|---|
Subject | Re: new heapcheck contrib module |
Date | |
Msg-id | CAAJ_b96_Xr2a+D0j8xKbOnCzURcVQm0V2DS+T_pfc+wt3BpL8g@mail.gmail.com Whole thread Raw |
In response to | Re: new heapcheck contrib module (Mark Dilger <mark.dilger@enterprisedb.com>) |
Responses |
Re: new heapcheck contrib module
|
List | pgsql-hackers |
On Tue, Jul 21, 2020 at 2:32 AM Mark Dilger <mark.dilger@enterprisedb.com> wrote: > [....] > > > > + StaticAssertStmt(InvalidOffsetNumber + 1 == FirstOffsetNumber, > > + "InvalidOffsetNumber > > increments to FirstOffsetNumber"); > > > > If you are going to rely on this property, I agree that it is good to > > check it. But it would be better to NOT rely on this property, and I > > suspect the code can be written quite cleanly without relying on it. > > And actually, that's what you did, because you first set ctx.offnum = > > InvalidOffsetNumber but then just after that you set ctx.offnum = 0 in > > the loop initializer. So AFAICS the first initializer, and the static > > assert, are pointless. > > Ah, right you are. Removed. > I can see the same assert and the unnecessary assignment in v12-0002, is that the same thing that is supposed to be removed, or am I missing something? > [....] > > +confess(HeapCheckContext * ctx, char *msg) > > +TransactionIdValidInRel(TransactionId xid, HeapCheckContext * ctx) > > +check_tuphdr_xids(HeapTupleHeader tuphdr, HeapCheckContext * ctx) > > > > This is what happens when you pgindent without adding all the right > > things to typedefs.list first ... or when you don't pgindent and have > > odd ideas about how to indent things. > > Hmm. I don't see the three lines of code you are quoting. Which patch is that from? > I think it was the same thing related to my previous suggestion to list new structures to typedefs.list. V12 has listed new structures but I think there are still some more adjustments needed in the code e.g. see space between HeapCheckContext and * (asterisk) that need to be fixed. I am not sure if the pgindent will do that or not. Here are a few more minor comments for the v12-0002 patch & some of them apply to other patches as well: #include "utils/snapmgr.h" - +#include "amcheck.h" Doesn't seem to be at the correct place -- need to be in sorted order. + if (!PG_ARGISNULL(3)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("starting block " INT64_FORMAT + " is out of bounds for relation with no blocks", + PG_GETARG_INT64(3)))); + if (!PG_ARGISNULL(4)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("ending block " INT64_FORMAT + " is out of bounds for relation with no blocks", + PG_GETARG_INT64(4)))); I think these errmsg() strings also should be in one line. + if (fatal) + { + if (ctx.toast_indexes) + toast_close_indexes(ctx.toast_indexes, ctx.num_toast_indexes, + ShareUpdateExclusiveLock); + if (ctx.toastrel) + table_close(ctx.toastrel, ShareUpdateExclusiveLock); Toast index and rel closing block style is not the same as at the ending of verify_heapam(). + /* If we get this far, we know the relation has at least one block */ + startblock = PG_ARGISNULL(3) ? 0 : PG_GETARG_INT64(3); + endblock = PG_ARGISNULL(4) ? ((int64) ctx.nblocks) - 1 : PG_GETARG_INT64(4); + if (startblock < 0 || endblock >= ctx.nblocks || startblock > endblock) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("block range " INT64_FORMAT " .. " INT64_FORMAT + " is out of bounds for relation with block count %u", + startblock, endblock, ctx.nblocks))); + ... ... + if (startblock < 0) + startblock = 0; + if (endblock < 0 || endblock > ctx.nblocks) + endblock = ctx.nblocks; Other than endblock < 0 case, do we really need that? I think due to the above error check the rest of the cases will not reach this place. + confess(ctx, psprintf( + "tuple xmax %u follows last assigned xid %u", + xmax, ctx->nextKnownValidXid)); + fatal = true; + } + } + + /* Check for tuple header corruption */ + if (ctx->tuphdr->t_hoff < SizeofHeapTupleHeader) + { + confess(ctx, + psprintf("tuple's header size is %u bytes which is less than the %u byte minimum valid header size", + ctx->tuphdr->t_hoff, + (unsigned) SizeofHeapTupleHeader)); confess() call has two different code styles, first one where psprintf()'s only argument got its own line and second style where psprintf has its own line with the argument. I think the 2nd style is what we do follow & correct, not the former. + if (rel->rd_rel->relam != HEAP_TABLE_AM_OID) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a heap", + RelationGetRelationName(rel)))); Like elsewhere, can we have errmsg as "only heap AM is supported" and error code is ERRCODE_FEATURE_NOT_SUPPORTED ? That all, for now, apologize for multiple review emails. Regards, Amul
pgsql-hackers by date: