
(table or index) before trying to open its relcache entry. This fixes race conditions in which someone else commits a change to the relation's catalog entries while we are in process of doing relcache load. Problems of that ilk have been reported sporadically for years, but it was not really practical to fix until recently --- for instance, the recent addition of WAL-log support for in-place updates helped. Along the way, remove pg_am.amconcurrent: all AMs are now expected to support concurrent update.
72 lines
2.9 KiB
C
72 lines
2.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* lmgr.h
|
|
* POSTGRES lock manager definitions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $PostgreSQL: pgsql/src/include/storage/lmgr.h,v 1.55 2006/07/31 20:09:05 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef LMGR_H
|
|
#define LMGR_H
|
|
|
|
#include "storage/lock.h"
|
|
#include "utils/rel.h"
|
|
|
|
|
|
extern void RelationInitLockInfo(Relation relation);
|
|
|
|
/* Lock a relation */
|
|
extern void LockRelationOid(Oid relid, LOCKMODE lockmode);
|
|
extern bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode);
|
|
extern void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode);
|
|
|
|
extern void LockRelation(Relation relation, LOCKMODE lockmode);
|
|
extern bool ConditionalLockRelation(Relation relation, LOCKMODE lockmode);
|
|
extern void UnlockRelation(Relation relation, LOCKMODE lockmode);
|
|
|
|
extern void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode);
|
|
extern void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode);
|
|
|
|
/* Lock a relation for extension */
|
|
extern void LockRelationForExtension(Relation relation, LOCKMODE lockmode);
|
|
extern void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode);
|
|
|
|
/* Lock a page (currently only used within indexes) */
|
|
extern void LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);
|
|
extern bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);
|
|
extern void UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);
|
|
|
|
/* Lock a tuple (see heap_lock_tuple before assuming you understand this) */
|
|
extern void LockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode);
|
|
extern bool ConditionalLockTuple(Relation relation, ItemPointer tid,
|
|
LOCKMODE lockmode);
|
|
extern void UnlockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode);
|
|
|
|
/* Lock an XID (used to wait for a transaction to finish) */
|
|
extern void XactLockTableInsert(TransactionId xid);
|
|
extern void XactLockTableDelete(TransactionId xid);
|
|
extern void XactLockTableWait(TransactionId xid);
|
|
extern bool ConditionalXactLockTableWait(TransactionId xid);
|
|
|
|
/* Lock a general object (other than a relation) of the current database */
|
|
extern void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid,
|
|
LOCKMODE lockmode);
|
|
extern void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid,
|
|
LOCKMODE lockmode);
|
|
|
|
/* Lock a shared-across-databases object (other than a relation) */
|
|
extern void LockSharedObject(Oid classid, Oid objid, uint16 objsubid,
|
|
LOCKMODE lockmode);
|
|
extern void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid,
|
|
LOCKMODE lockmode);
|
|
|
|
/* Knowledge about which locktags describe temp objects */
|
|
extern bool LockTagIsTemp(const LOCKTAG *tag);
|
|
|
|
#endif /* LMGR_H */
|