On Fri, May 14, 2004 at 11:21:42PM -0400, Tom Lane wrote: > Alvaro Herrera <[EMAIL PROTECTED]> writes: > > Ok, I created a function to copy a hash table (from dynahash). So now > > at subtransaction start the RelationIdCache and RelationSysNameCache > > hash tables are copied, and if the subtransaction aborts the previous > > hash tables are restored. > > I don't think that will do; what about updates absorbed during the > subtrans from other backends' changes? In any case, copying the whole > cache state during every subtrans start is not the kind of overhead > I wish to pay ...
Oh, I see that now. (And I agree with the overhead argument anyway.) I think I can add a "refcount stack" to RelationData, and update it each time a subtransaction is entered; on abort, previous counts are restored for all relations. This is certainly much cheaper than saving the whole hash, and it is more correct regarding invalidations. I'll leave the hash_copy() function though ... maybe someone can think on a use for it ... I just did something like the refcount stack for the CatCache code. I'm not sure how to verify that it actually works ... will play with gdb. > > Regarding the lock mechanism, I simply added some code to LockReleaseAll > > so it gets the array of committed child Xids; on subtransaction abort, > > the whole lock struct is scanned just like it's done on main transaction > > abort; only those locks affiliated with one of the given Xids are > > released. This is naive, so if it's incorrect please comment. > > Not sure; it's been a long day and I'm tired ... will think about it > tomorrow ... The kind of issue I am concerned with is what happens when a subtransaction upgrades a previously acquired lock. Does this release the lesser lock? I don't think so. -- Alvaro Herrera (<alvherre[a]dcc.uchile.cl>) "The first of April is the day we remember what we are the other 364 days of the year" (Mark Twain) ---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to [EMAIL PROTECTED] so that your message can get through to the mailing list cleanly