On 10/02/2023 04:51, David Rowley wrote:
> I've attached another set of patches. I do need to spend longer
> looking at this. I'm mainly attaching these as CI seems to be
> highlighting a problem that I'm unable to recreate locally and I
> wanted to see if the attached fixes it.
I like this patch's approach.
> index 296dc82d2ee..edb8b6026e5 100644
> --- a/src/backend/commands/discard.c
> +++ b/src/backend/commands/discard.c
> @@ -71,7 +71,7 @@ DiscardAll(bool isTopLevel)
> Async_UnlistenAll();
> - LockReleaseAll(USER_LOCKMETHOD, true);
> + LockReleaseSession(USER_LOCKMETHOD);
> ResetPlanCache();
This assumes that there are no transaction-level advisory locks. I think
that's OK. It took me a while to convince myself of that, though. I
think we need a high level comment somewhere that explains what
assumptions we make on which locks can be held in session mode and which
in transaction mode.
> @@ -3224,14 +3206,6 @@ PostPrepare_Locks(TransactionId xid)
> Assert(lock->nGranted <= lock->nRequested);
> Assert((proclock->holdMask & ~lock->grantMask) == 0);
>
> - /* Ignore it if nothing to release (must be a session lock) */
> - if (proclock->releaseMask == 0)
> - continue;
> -
> - /* Else we should be releasing all locks */
> - if (proclock->releaseMask != proclock->holdMask)
> - elog(PANIC, "we seem to have dropped a bit somewhere");
> -
> /*
> * We cannot simply modify proclock->tag.myProc to reassign
> * ownership of the lock, because that's part of the hash key and
This looks wrong. If you prepare a transaction that is holding any
session locks, we will now transfer them to the prepared transaction.
And its locallock entry will be out of sync. To fix, I think we could
keep around the hash table that CheckForSessionAndXactLocks() builds,
and use that here.
--
Heikki Linnakangas
Neon (https://neon.tech)