> We definitely need some interlocking to handle this. For lack of better > APIs, we could do a LockDatabaseObject() call in AccessShareLock mode on the > namespace and release the same on completion of the creation of the object. > > Thoughts?
In general, we've been reluctant to add locking on non-table objects for reasons of overhead. You can, for example, drop a type or function while a query is running that depends on it (which is not true for tables). But I think it is sensible to do it for DDL commands, which shouldn't be frequent enough for the overhead to matter much.
Agreed. Especially if the race condition has non-trivial downsides as mentioned in the tablespace case.
When I rewrote the comment code for 9.1, I added locking that works just this way, to prevent pg_description entries from being orphaned; see the end of get_object_address().
Yeah thanks, that does the object locking. For pre-9.1 versions, we will need a similar solution. I encountered the issue on 8.3.x..