mirror of
https://github.com/postgres/postgres.git
synced 2025-08-31 17:02:12 +03:00
Reimplement hash index locking algorithms, per my recent proposal to
pghackers. This fixes the problem recently reported by Markus KrÌutner (hash bucket split corrupts the state of scans being done concurrently), and I believe it also fixes all the known problems with deadlocks in hash index operations. Hash indexes are still not really ready for prime time (since they aren't WAL-logged), but this is a step forward.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.59 2003/08/17 22:41:12 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.60 2003/09/04 22:06:27 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -153,7 +153,7 @@ LockRelation(Relation relation, LOCKMODE lockmode)
|
||||
* As above, but only lock if we can get the lock without blocking.
|
||||
* Returns TRUE iff the lock was acquired.
|
||||
*
|
||||
* NOTE: we do not currently need conditional versions of the other
|
||||
* NOTE: we do not currently need conditional versions of all the
|
||||
* LockXXX routines in this file, but they could easily be added if needed.
|
||||
*/
|
||||
bool
|
||||
@@ -264,6 +264,26 @@ LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
|
||||
elog(ERROR, "LockAcquire failed");
|
||||
}
|
||||
|
||||
/*
|
||||
* ConditionalLockPage
|
||||
*
|
||||
* As above, but only lock if we can get the lock without blocking.
|
||||
* Returns TRUE iff the lock was acquired.
|
||||
*/
|
||||
bool
|
||||
ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
|
||||
{
|
||||
LOCKTAG tag;
|
||||
|
||||
MemSet(&tag, 0, sizeof(tag));
|
||||
tag.relId = relation->rd_lockInfo.lockRelId.relId;
|
||||
tag.dbId = relation->rd_lockInfo.lockRelId.dbId;
|
||||
tag.objId.blkno = blkno;
|
||||
|
||||
return LockAcquire(LockTableId, &tag, GetCurrentTransactionId(),
|
||||
lockmode, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* UnlockPage
|
||||
*/
|
||||
|
Reference in New Issue
Block a user