mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Fix crash if LockErrorCleanup() is called twice
The refactoring in commit 3c0fd64fec removed the clearing of awaitedLock from LockErrorCleanup(). It's still needed, otherwise LockErrorCleanup() during abort processing will try to update the LOCALLOCK struct even after the lock has already been released. Put it back. Reported-by: Richard Guo <guofenglinux@gmail.com> Reported-by: Robins Tharakan <tharakan@gmail.com> Reported-by: Alexander Lakhin <exclusion@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/CAMbWs4_dNX1SzBmvFdoY-LxJh_4W_BjtVd5i008ihfU-wFF=eg@mail.gmail.com Discussion: https://www.postgresql.org/message-id/18832-38e5575b1bbd7277@postgresql.org Discussion: https://www.postgresql.org/message-id/e11a30e5-c0d8-491d-8546-3a1b50c10ad4@gmail.com
This commit is contained in:
parent
9ac6f7e7ce
commit
51a0382e8d
@ -1896,6 +1896,15 @@ GetAwaitedLock(void)
|
|||||||
return awaitedLock;
|
return awaitedLock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ResetAwaitedLock -- Forget that we are waiting on a lock.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ResetAwaitedLock(void)
|
||||||
|
{
|
||||||
|
awaitedLock = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MarkLockClear -- mark an acquired lock as "clear"
|
* MarkLockClear -- mark an acquired lock as "clear"
|
||||||
*
|
*
|
||||||
|
@ -814,6 +814,8 @@ LockErrorCleanup(void)
|
|||||||
GrantAwaitedLock();
|
GrantAwaitedLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResetAwaitedLock();
|
||||||
|
|
||||||
LWLockRelease(partitionLock);
|
LWLockRelease(partitionLock);
|
||||||
|
|
||||||
RESUME_INTERRUPTS();
|
RESUME_INTERRUPTS();
|
||||||
|
@ -588,6 +588,7 @@ extern bool LockCheckConflicts(LockMethod lockMethodTable,
|
|||||||
extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode);
|
extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode);
|
||||||
extern void GrantAwaitedLock(void);
|
extern void GrantAwaitedLock(void);
|
||||||
extern LOCALLOCK *GetAwaitedLock(void);
|
extern LOCALLOCK *GetAwaitedLock(void);
|
||||||
|
extern void ResetAwaitedLock(void);
|
||||||
|
|
||||||
extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode);
|
extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode);
|
||||||
extern LockData *GetLockStatusData(void);
|
extern LockData *GetLockStatusData(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user