Re: Schema variables - new implementation for Postgres 15
Pavel Stehule <pavel.stehule@gmail.com>
From: Pavel Stehule <pavel.stehule@gmail.com>
To: Julien Rouhaud <rjuju123@gmail.com>
Cc: Dean Rasheed <dean.a.rasheed@gmail.com>,
Joel Jacobson <joel@compiler.org>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2022-01-25T21:53:00Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Allow underscores in integer and numeric constants.
- faff8f8e47f1 16.0 cited
-
Remove special outfuncs/readfuncs handling of RangeVar.catalogname.
- 3cece34be842 16.0 cited
-
Remove extra space from dumped ALTER DEFAULT PRIVILEGES.
- 2af33369e794 16.0 cited
-
Create FKs properly when attaching table as partition
- b0284bfb1db5 16.0 cited
-
psql: improve tab-complete's handling of variant SQL names.
- 02b8048ba5dc 15.0 cited
Attachments
- 0002-column-doesn-t-exists-message.patch (text/x-patch) patch 0002
- 0001-session-variables.patch (text/x-patch) patch 0001
Hi út 25. 1. 2022 v 6:18 odesílatel Julien Rouhaud <rjuju123@gmail.com> napsal: > Hi, > > On Mon, Jan 24, 2022 at 12:33:11PM +0100, Pavel Stehule wrote: > > > > here is updated patch with locking support > > Thanks for updating the patch! > > While the locking is globally working as intended, I found a few problems > with > it. > > First, I don't think that acquiring the lock in > get_session_variable_type_typmod_collid() and > prepare_variable_for_reading() is > the correct approach. In transformColumnRef() and transformLetStmt() you > first > call IdentifyVariable() to check if the given name is a variable without > locking it and later try to lock the variable if you get a valid Oid. > This is > bug prone as any other backend could drop the variable between the two > calls > and you would end up with a cache lookup failure. I think the lock should > be > acquired during IdentifyVariable. It should probably be optional as one > codepath only needs the information to raise a warning when a variable is > shadowed, so a concurrent drop isn't a problem there. > I moved lock to IdentifyVariable routine > > For prepare_variable_for_reading(), the callers are CopySessionVariable() > and > GetSessionVariable(). IIUC those should take care of executor-time locks, > but > shouldn't there be some changes for planning, like in > AcquirePlannerLocks()? > done > > Some other comments on this part of the patch: > > @@ -717,6 +730,9 @@ RemoveSessionVariable(Oid varid) > Relation rel; > HeapTuple tup; > > + /* Wait, when dropped variable is not used */ > + LockDatabaseObject(VariableRelationId, varid, 0, AccessExclusiveLock); > > Why do you explicitly try to acquire an AEL on the variable here? > RemoveObjects / get_object_address should guarantee that this was already > done. > You could add an assert LockHeldByMe() here, but no other code path do it > so it > would probably waste cycles in assert builds for nothing as it's a > fundamental > guarantee. > > removed > > @@ -747,6 +763,9 @@ RemoveSessionVariable(Oid varid) > * only when current transaction will be commited. > */ > register_session_variable_xact_action(varid, ON_COMMIT_RESET); > + > + /* Release lock */ > + UnlockDatabaseObject(VariableRelationId, varid, 0, > AccessExclusiveLock); > } > > Why releasing the lock here? It will be done at the end of the > transaction, > and you certainly don't want other backends to start using this variable in > between. Also, since you acquired the lock a second time it only > decreases the > lock count in the locallock so the lock isn't released anyway. > > removed + * Returns type, typmod and collid of session variable. > + * > + * As a side effect this function acquires AccessShareLock on the > + * related session variable. > */ > void > -get_session_variable_type_typmod_collid(Oid varid, Oid *typid, int32 > *typmod, Oid *collid) > +get_session_variable_type_typmod_collid(Oid varid, Oid *typid, int32 > *typmod, Oid *collid, > + bool lock_held) > > > lock_held is a bit misleading. If you keep some similar parameter for > this or > another function, maybe name it lock_it or something like that instead? > > Also, the comment isn't accurate and should say that an ASL is acquired > iff the > variable is true. > removed > > + /* > + * Acquire a lock on session variable, which we won't release until > commit. > + * This ensure that one backend cannot to drop session variable used by > + * second backend. > + */ > > (and similar comments) > I don't think it's necessary to explain why we acquire locks, we should > just > say that the lock will be kept for the whole transaction (and not until a > commit) > removed > > And while looking at nearby code, it's probably worthwhile to add an > Assert in > create_sessionvars_hashtable() to validate that sessionvars htab is NULL. > done attached updated patch Regards Pavel