mirror of
https://github.com/postgres/postgres.git
synced 2026-04-29 02:00:35 -04:00
This uses the progress reporting infrastructure added by c16dc1aca5,
adding support for CREATE INDEX and CREATE INDEX CONCURRENTLY.
There are two pieces to this: one is index-AM-agnostic, and the other is
AM-specific. The latter is fairly elaborate for btrees, including
reportage for parallel index builds and the separate phases that btree
index creation uses; other index AMs, which are much simpler in their
building procedures, have simplistic reporting only, but that seems
sufficient, at least for non-concurrent builds.
The index-AM-agnostic part is fairly complete, providing insight into
the CONCURRENTLY wait phases as well as block-based progress during the
index validation table scan. (The index validation index scan requires
patching each AM, which has not been included here.)
Reviewers: Rahila Syed, Pavan Deolasee, Tatsuro Yamada
Discussion: https://postgr.es/m/20181220220022.mg63bhk26zdpvmcj@alvherre.pgsql
111 lines
4.3 KiB
C
111 lines
4.3 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* lmgr.h
|
|
* POSTGRES lock manager definitions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/storage/lmgr.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef LMGR_H
|
|
#define LMGR_H
|
|
|
|
#include "lib/stringinfo.h"
|
|
#include "storage/itemptr.h"
|
|
#include "storage/lock.h"
|
|
#include "utils/rel.h"
|
|
|
|
|
|
/* XactLockTableWait operations */
|
|
typedef enum XLTW_Oper
|
|
{
|
|
XLTW_None,
|
|
XLTW_Update,
|
|
XLTW_Delete,
|
|
XLTW_Lock,
|
|
XLTW_LockUpdated,
|
|
XLTW_InsertIndex,
|
|
XLTW_InsertIndexUnique,
|
|
XLTW_FetchUpdated,
|
|
XLTW_RecheckExclusionConstr
|
|
} XLTW_Oper;
|
|
|
|
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 UnlockRelationOid(Oid 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 bool CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode,
|
|
bool orstronger);
|
|
extern bool LockHasWaitersRelation(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);
|
|
extern bool ConditionalLockRelationForExtension(Relation relation,
|
|
LOCKMODE lockmode);
|
|
extern int RelationExtensionLockWaiterCount(Relation relation);
|
|
|
|
/* 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, Relation rel,
|
|
ItemPointer ctid, XLTW_Oper oper);
|
|
extern bool ConditionalXactLockTableWait(TransactionId xid);
|
|
|
|
/* Lock VXIDs, specified by conflicting locktags */
|
|
extern void WaitForLockers(LOCKTAG heaplocktag, LOCKMODE lockmode, bool progress);
|
|
extern void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress);
|
|
|
|
/* Lock an XID for tuple insertion (used to wait for an insertion to finish) */
|
|
extern uint32 SpeculativeInsertionLockAcquire(TransactionId xid);
|
|
extern void SpeculativeInsertionLockRelease(TransactionId xid);
|
|
extern void SpeculativeInsertionWait(TransactionId xid, uint32 token);
|
|
|
|
/* 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);
|
|
|
|
extern void LockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid,
|
|
LOCKMODE lockmode);
|
|
extern void UnlockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid,
|
|
LOCKMODE lockmode);
|
|
|
|
/* Describe a locktag for error messages */
|
|
extern void DescribeLockTag(StringInfo buf, const LOCKTAG *tag);
|
|
|
|
extern const char *GetLockNameFromTagType(uint16 locktag_type);
|
|
|
|
#endif /* LMGR_H */
|