Re: [HACKERS] RE: Getting rid of setheapoverride (was Re: [COMMITTERS] heap.c) - Mailing list pgsql-hackers

From Tom Lane
Subject Re: [HACKERS] RE: Getting rid of setheapoverride (was Re: [COMMITTERS] heap.c)
Date
Msg-id 20198.948093168@sss.pgh.pa.us
Whole thread Raw
In response to Re: [HACKERS] RE: Getting rid of setheapoverride (was Re: [COMMITTERS] heap.c)  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses RE: [HACKERS] RE: Getting rid of setheapoverride (was Re: [COMMITTERS] heap.c)
Re: [HACKERS] RE: Getting rid of setheapoverride (was Re: [COMMITTERS] heap.c)
List pgsql-hackers
>>>> Oh,I was just looking at heapoverride stuff quite accidentally. 
>>>> Yes, this call is ugly and should be replaced by CommandCounterIncrement()
>> 
>> OK, I'm running a build now with setheapoverride calls removed.
>> Will see what happens.

Well, it seems to work, but...

>> About half of the setheapoverride calls surrounded heap_update()
>> (formerly called heap_replace()) calls.  AFAICS there is no need
>> for these calls unless heap_update itself needs them --- but there
>> are many calls to heap_update that do not have setheapoverride.

I figured out that the cases where setheapoverride (or, now,
CommandCounterIncrement) were needed were the cases where the
heap_update might be updating a tuple created earlier in the
same command.  pg_operator.c has some cases like that, but many of
the other uses of setheapoverride seem to be unnecessary.

However, I'm a little uncomfortable with committing this change,
because my first try at it worked OK at creating things but fell
right over on DROP TABLE.  I had replaced the setheapoverride(true)
in heap_drop_with_catalog() (backend/catalog/heap.c) with a
CommandCounterIncrement, and it failed with this backtrace:

(gdb) bt
#0  elog (lev=-1, fmt=0x6b160 "cannot find attribute %d of relation %s")   at elog.c:112
#1  0x1767d8 in build_tupdesc_ind (buildinfo={infotype = 1, i = {       info_id = 19040,       info_name = 0x4a60}},
relation=0x4006ef00,natts=1074198864) at relcache.c:527
 
#2  0x176554 in RelationBuildTupleDesc (buildinfo={infotype = 1, i = {       info_id = 19040,       info_name = 0x4a60
}},  relation=0x1, natts=1074198864) at relcache.c:437
 
#3  0x177230 in RelationBuildDesc (buildinfo={infotype = 1, i = {       info_id = 19040,       info_name = 0x4a60 }},
oldrelation=0x4006ef00)at relcache.c:808
 
#4  0x177b28 in RelationClearRelation (relation=0x4006ef00, rebuildIt=0 '\000')   at relcache.c:1279
#5  0x177bbc in RelationFlushRelation (relationPtr=0xffffffff,   onlyFlushReferenceCountZero=96 '`') at
relcache.c:1320
#6  0x177e10 in RelationIdInvalidateRelationCacheByRelationId (   relationId=19040) at relcache.c:1415
#7  0x175968 in CacheIdInvalidate (cacheId=4294967295, hashIndex=438624,   pointer=0x1) at inval.c:544
#8  0x175ae8 in InvalidationMessageCacheInvalidate (message=0x4007cce4)   at inval.c:657
#9  0x175490 in LocalInvalidInvalidate (invalid=0x4007cce4 "r",   function=0x4000c3ca <DINFINITY+9226>, freemember=1
'\001')at inval.c:173
 
#10 0x175ca4 in ImmediateLocalInvalidation (send=-1 '�') at inval.c:806
#11 0x9d0b0 in AtCommit_LocalCache () at xact.c:687
#12 0x9cf70 in CommandCounterIncrement () at xact.c:520
#13 0xa7a08 in heap_drop_with_catalog (relname=0x4006ef00 "����")   at heap.c:1528
#14 0xb16ac in RemoveRelation (name=0x40083328 "ff1") at creatinh.c:217
#15 0x13ce84 in ProcessUtility (parsetree=0x40083370, dest=Remote)   at utility.c:201
#16 0x13add0 in pg_exec_query_dest (query_string=0x40024270 "drop table ff1",   dest=Remote, aclOverride=1 '\001') at
postgres.c:721

Apparently, if I call CommandCounterIncrement while partway through
dropping a relation, it will try to rebuild the relcache entry for
the relation --- and of course fail.  I'm too tired to figure out
whether this is just a small coding error in the new cache invalidation
code or whether it's a serious limitation in the whole design.  Hiroshi,
what do you think?

I was able to get around this by simply removing CommandCounterIncrement
from heap_drop_with_catalog entirely --- dropping tables seems to work
fine that way ... but I don't trust it ...
        regards, tom lane


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: [HACKERS] pg_dump not in very good shape
Next
From: Thomas Lockhart
Date:
Subject: Re: [HACKERS] TODO list