Thread: BUG #17591: elog(ERROR) cause SharedSnapshotLock deadlock

BUG #17591: elog(ERROR) cause SharedSnapshotLock deadlock

From
PG Bug reporting form
Date:
The following bug has been logged on the website:

Bug reference:      17591
Logged by:          ma liangzhu
Email address:      ma100@hotmail.com
PostgreSQL version: 14.5
Operating system:   centos7
Description:

in lock.c, we can see code  Release lock before return    , e.g.

```c
996: LockAcquireExtended
{ 
    LWLockAcquire(partitionLock, LW_EXCLUSIVE);
 
    proclock = SetupLockInTable( );
    if (!proclock)
    {     
        LWLockRelease(partitionLock);  --- Release lock before return     
        ereport(ERROR,)
    }
}
```

bug we can see some code doesn't release the lock. Does it may cause
deadlock?

```c
LockRelease()
{
    LWLockAcquire(partitionLock, LW_EXCLUSIVE);
 
    lock = locallock->lock;
    if (!lock)
    { 
        lock = (LOCK *) hash_search_with_hash_value( );
        if (!lock)
2126:            elog(ERROR, "failed to re-find shared lock object");  -- exit
without release
    }
```


Re: BUG #17591: elog(ERROR) cause SharedSnapshotLock deadlock

From
Zhang Mingli
Date:
Hi,

Didn’t see any bugs here, it report an error and the transaction will end and release all resources.

Regards,
Zhang Mingli
On Aug 22, 2022, 14:58 +0800, PG Bug reporting form <noreply@postgresql.org>, wrote:
The following bug has been logged on the website:

Bug reference: 17591
Logged by: ma liangzhu
Email address: ma100@hotmail.com
PostgreSQL version: 14.5
Operating system: centos7
Description:

in lock.c, we can see code Release lock before return , e.g.

```c
996: LockAcquireExtended
{
LWLockAcquire(partitionLock, LW_EXCLUSIVE);

proclock = SetupLockInTable( );
if (!proclock)
{
LWLockRelease(partitionLock); --- Release lock before return
ereport(ERROR,)
}
}
```

bug we can see some code doesn't release the lock. Does it may cause
deadlock?

```c
LockRelease()
{
LWLockAcquire(partitionLock, LW_EXCLUSIVE);

lock = locallock->lock;
if (!lock)
{
lock = (LOCK *) hash_search_with_hash_value( );
if (!lock)
2126: elog(ERROR, "failed to re-find shared lock object"); -- exit
without release
}
```

Re: BUG #17591: elog(ERROR) cause SharedSnapshotLock deadlock

From
Tom Lane
Date:
PG Bug reporting form <noreply@postgresql.org> writes:
> in lock.c, we can see code  Release lock before return    , e.g.
> ...
> bug we can see some code doesn't release the lock. Does it may cause
> deadlock?

Transaction cleanup will automatically release all locks (and other
resources too).  So the places that do a manual release before
elog(ERROR) are something of a waste of code space.  It might be worth
doing that if you're concerned about holding the lock for the minimum
possible amount of time; but usually that's only a consideration for
very heavily-contended spinlocks or LWLocks.

            regards, tom lane