Hi, We were working on this issue and thinking if we could actually make pg_class(rd_rel) part of recache entry upgradable. To achieve this we can allocate Form_pg_class structures (for shared relations… a small number) on shared memory. We do not need global pg_internal_init file as new backend during boot up will be set to point at already stored Form_pg_class structure.
Thanks, Nishant On 5/27/18, 1:01 PM, "Andres Freund" <and...@anarazel.de> wrote: Hi, On 2018-05-27 13:22:21 -0400, Tom Lane wrote: > But I don't think there's any need for special magic here: we just > have to accept the fact that there's a need to flush that cache > sometimes. In normal use it shouldn't happen often enough to be a > performance problem. Yea, it's not that problematic. We already remove the local init file. I started out trying to write a version of invalidation that also WAL logs shared inval, but that turns out to be hard to do without breaking compatibilty. So I think we should just always unlink the shared one - that seems to work well. > FWIW, I'm not on board with "memcpy the whole row". I think the right > thing is more like what we do in RelationReloadIndexInfo, ie copy over > the specific fields that we expect to be mutable. But that's what RelationReloadIndexInfo() etc do? relp = (Form_pg_class) GETSTRUCT(pg_class_tuple); memcpy(relation->rd_rel, relp, CLASS_TUPLE_SIZE); I don't think we need to modify anything outside of rd_rel at this point? I've a patch that seems to work, that mostly needs some comment polishing. Greetings, Andres Freund