PostgreSQL Source Code  git master
predicate_internals.h File Reference
#include "storage/lock.h"
#include "storage/lwlock.h"
Include dependency graph for predicate_internals.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  SERIALIZABLEXACT
 
struct  PredXactListElementData
 
struct  PredXactListData
 
struct  RWConflictData
 
struct  RWConflictPoolHeaderData
 
struct  SERIALIZABLEXIDTAG
 
struct  SERIALIZABLEXID
 
struct  PREDICATELOCKTARGETTAG
 
struct  PREDICATELOCKTARGET
 
struct  PREDICATELOCKTAG
 
struct  PREDICATELOCK
 
struct  LOCALPREDICATELOCK
 
struct  PredicateLockData
 
struct  TwoPhasePredicateXactRecord
 
struct  TwoPhasePredicateLockRecord
 
struct  TwoPhasePredicateRecord
 

Macros

#define InvalidSerCommitSeqNo   ((SerCommitSeqNo) PG_UINT64_MAX)
 
#define RecoverySerCommitSeqNo   ((SerCommitSeqNo) 1)
 
#define FirstNormalSerCommitSeqNo   ((SerCommitSeqNo) 2)
 
#define SXACT_FLAG_COMMITTED   0x00000001 /* already committed */
 
#define SXACT_FLAG_PREPARED   0x00000002 /* about to commit */
 
#define SXACT_FLAG_ROLLED_BACK   0x00000004 /* already rolled back */
 
#define SXACT_FLAG_DOOMED   0x00000008 /* will roll back */
 
#define SXACT_FLAG_CONFLICT_OUT   0x00000010
 
#define SXACT_FLAG_READ_ONLY   0x00000020
 
#define SXACT_FLAG_DEFERRABLE_WAITING   0x00000040
 
#define SXACT_FLAG_RO_SAFE   0x00000080
 
#define SXACT_FLAG_RO_UNSAFE   0x00000100
 
#define SXACT_FLAG_SUMMARY_CONFLICT_IN   0x00000200
 
#define SXACT_FLAG_SUMMARY_CONFLICT_OUT   0x00000400
 
#define SXACT_FLAG_PARTIALLY_RELEASED   0x00000800
 
#define PredXactListElementDataSize   ((Size)MAXALIGN(sizeof(PredXactListElementData)))
 
#define PredXactListDataSize   ((Size)MAXALIGN(sizeof(PredXactListData)))
 
#define RWConflictDataSize   ((Size)MAXALIGN(sizeof(RWConflictData)))
 
#define RWConflictPoolHeaderDataSize   ((Size)MAXALIGN(sizeof(RWConflictPoolHeaderData)))
 
#define SET_PREDICATELOCKTARGETTAG_RELATION(locktag, dboid, reloid)
 
#define SET_PREDICATELOCKTARGETTAG_PAGE(locktag, dboid, reloid, blocknum)
 
#define SET_PREDICATELOCKTARGETTAG_TUPLE(locktag, dboid, reloid, blocknum, offnum)
 
#define GET_PREDICATELOCKTARGETTAG_DB(locktag)   ((Oid) (locktag).locktag_field1)
 
#define GET_PREDICATELOCKTARGETTAG_RELATION(locktag)   ((Oid) (locktag).locktag_field2)
 
#define GET_PREDICATELOCKTARGETTAG_PAGE(locktag)   ((BlockNumber) (locktag).locktag_field3)
 
#define GET_PREDICATELOCKTARGETTAG_OFFSET(locktag)   ((OffsetNumber) (locktag).locktag_field4)
 
#define GET_PREDICATELOCKTARGETTAG_TYPE(locktag)
 
#define InvalidSerializableXact   ((SERIALIZABLEXACT *) NULL)
 

Typedefs

typedef uint64 SerCommitSeqNo
 
typedef struct SERIALIZABLEXACT SERIALIZABLEXACT
 
typedef struct PredXactListElementData PredXactListElementData
 
typedef struct PredXactListElementDataPredXactListElement
 
typedef struct PredXactListData PredXactListData
 
typedef struct PredXactListDataPredXactList
 
typedef struct RWConflictData RWConflictData
 
typedef struct RWConflictDataRWConflict
 
typedef struct RWConflictPoolHeaderData RWConflictPoolHeaderData
 
typedef struct RWConflictPoolHeaderDataRWConflictPoolHeader
 
typedef struct SERIALIZABLEXIDTAG SERIALIZABLEXIDTAG
 
typedef struct SERIALIZABLEXID SERIALIZABLEXID
 
typedef struct PREDICATELOCKTARGETTAG PREDICATELOCKTARGETTAG
 
typedef struct PREDICATELOCKTARGET PREDICATELOCKTARGET
 
typedef struct PREDICATELOCKTAG PREDICATELOCKTAG
 
typedef struct PREDICATELOCK PREDICATELOCK
 
typedef struct LOCALPREDICATELOCK LOCALPREDICATELOCK
 
typedef enum PredicateLockTargetType PredicateLockTargetType
 
typedef struct PredicateLockData PredicateLockData
 
typedef enum TwoPhasePredicateRecordType TwoPhasePredicateRecordType
 
typedef struct TwoPhasePredicateXactRecord TwoPhasePredicateXactRecord
 
typedef struct TwoPhasePredicateLockRecord TwoPhasePredicateLockRecord
 
typedef struct TwoPhasePredicateRecord TwoPhasePredicateRecord
 

Enumerations

enum  PredicateLockTargetType { PREDLOCKTAG_RELATION, PREDLOCKTAG_PAGE, PREDLOCKTAG_TUPLE }
 
enum  TwoPhasePredicateRecordType { TWOPHASEPREDICATERECORD_XACT, TWOPHASEPREDICATERECORD_LOCK }
 

Functions

PredicateLockDataGetPredicateLockStatusData (void)
 
int GetSafeSnapshotBlockingPids (int blocked_pid, int *output, int output_size)
 

Macro Definition Documentation

◆ FirstNormalSerCommitSeqNo

#define FirstNormalSerCommitSeqNo   ((SerCommitSeqNo) 2)

Definition at line 39 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and ReleasePredicateLocks().

◆ GET_PREDICATELOCKTARGETTAG_DB

#define GET_PREDICATELOCKTARGETTAG_DB (   locktag)    ((Oid) (locktag).locktag_field1)

◆ GET_PREDICATELOCKTARGETTAG_OFFSET

#define GET_PREDICATELOCKTARGETTAG_OFFSET (   locktag)    ((OffsetNumber) (locktag).locktag_field4)

Definition at line 427 of file predicate_internals.h.

Referenced by CheckTargetForConflictsIn(), and pg_lock_status().

◆ GET_PREDICATELOCKTARGETTAG_PAGE

#define GET_PREDICATELOCKTARGETTAG_PAGE (   locktag)    ((BlockNumber) (locktag).locktag_field3)

Definition at line 425 of file predicate_internals.h.

Referenced by GetParentPredicateLockTag(), and pg_lock_status().

◆ GET_PREDICATELOCKTARGETTAG_RELATION

#define GET_PREDICATELOCKTARGETTAG_RELATION (   locktag)    ((Oid) (locktag).locktag_field2)

◆ GET_PREDICATELOCKTARGETTAG_TYPE

#define GET_PREDICATELOCKTARGETTAG_TYPE (   locktag)
Value:
(((locktag).locktag_field4 != InvalidOffsetNumber) ? PREDLOCKTAG_TUPLE : \
(((locktag).locktag_field3 != InvalidBlockNumber) ? PREDLOCKTAG_PAGE : \
PREDLOCKTAG_RELATION))
#define InvalidOffsetNumber
Definition: off.h:26
#define InvalidBlockNumber
Definition: block.h:33

Definition at line 429 of file predicate_internals.h.

Referenced by DropAllPredicateLocksFromTable(), GetParentPredicateLockTag(), MaxPredicateChildLocks(), pg_lock_status(), and PredicateLockAcquire().

◆ InvalidSerCommitSeqNo

◆ InvalidSerializableXact

◆ PredXactListDataSize

#define PredXactListDataSize   ((Size)MAXALIGN(sizeof(PredXactListData)))

Definition at line 194 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

◆ PredXactListElementDataSize

#define PredXactListElementDataSize   ((Size)MAXALIGN(sizeof(PredXactListElementData)))

Definition at line 156 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

◆ RecoverySerCommitSeqNo

#define RecoverySerCommitSeqNo   ((SerCommitSeqNo) 1)

Definition at line 38 of file predicate_internals.h.

Referenced by predicatelock_twophase_recover().

◆ RWConflictDataSize

#define RWConflictDataSize   ((Size)MAXALIGN(sizeof(RWConflictData)))

Definition at line 218 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

◆ RWConflictPoolHeaderDataSize

#define RWConflictPoolHeaderDataSize   ((Size)MAXALIGN(sizeof(RWConflictPoolHeaderData)))

Definition at line 229 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

◆ SET_PREDICATELOCKTARGETTAG_PAGE

#define SET_PREDICATELOCKTARGETTAG_PAGE (   locktag,
  dboid,
  reloid,
  blocknum 
)
Value:
((locktag).locktag_field1 = (dboid), \
(locktag).locktag_field2 = (reloid), \
(locktag).locktag_field3 = (blocknum), \
(locktag).locktag_field4 = InvalidOffsetNumber)
#define InvalidOffsetNumber
Definition: off.h:26

Definition at line 409 of file predicate_internals.h.

Referenced by CheckForSerializableConflictIn(), GetParentPredicateLockTag(), PageIsPredicateLocked(), PredicateLockPage(), and PredicateLockPageSplit().

◆ SET_PREDICATELOCKTARGETTAG_RELATION

#define SET_PREDICATELOCKTARGETTAG_RELATION (   locktag,
  dboid,
  reloid 
)
Value:
((locktag).locktag_field1 = (dboid), \
(locktag).locktag_field2 = (reloid), \
(locktag).locktag_field3 = InvalidBlockNumber, \
(locktag).locktag_field4 = InvalidOffsetNumber)
#define InvalidOffsetNumber
Definition: off.h:26
#define InvalidBlockNumber
Definition: block.h:33

Definition at line 403 of file predicate_internals.h.

Referenced by CheckForSerializableConflictIn(), DropAllPredicateLocksFromTable(), GetParentPredicateLockTag(), PredicateLockRelation(), and PredicateLockTID().

◆ SET_PREDICATELOCKTARGETTAG_TUPLE

#define SET_PREDICATELOCKTARGETTAG_TUPLE (   locktag,
  dboid,
  reloid,
  blocknum,
  offnum 
)
Value:
((locktag).locktag_field1 = (dboid), \
(locktag).locktag_field2 = (reloid), \
(locktag).locktag_field3 = (blocknum), \
(locktag).locktag_field4 = (offnum))

Definition at line 415 of file predicate_internals.h.

Referenced by CheckForSerializableConflictIn(), and PredicateLockTID().

◆ SXACT_FLAG_COMMITTED

#define SXACT_FLAG_COMMITTED   0x00000001 /* already committed */

Definition at line 118 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and ReleasePredicateLocks().

◆ SXACT_FLAG_CONFLICT_OUT

#define SXACT_FLAG_CONFLICT_OUT   0x00000010

Definition at line 127 of file predicate_internals.h.

Referenced by ReleasePredicateLocks().

◆ SXACT_FLAG_DEFERRABLE_WAITING

#define SXACT_FLAG_DEFERRABLE_WAITING   0x00000040

Definition at line 129 of file predicate_internals.h.

Referenced by GetSafeSnapshot().

◆ SXACT_FLAG_DOOMED

#define SXACT_FLAG_DOOMED   0x00000008 /* will roll back */

◆ SXACT_FLAG_PARTIALLY_RELEASED

#define SXACT_FLAG_PARTIALLY_RELEASED   0x00000800

Definition at line 139 of file predicate_internals.h.

Referenced by ReleasePredicateLocks().

◆ SXACT_FLAG_PREPARED

#define SXACT_FLAG_PREPARED   0x00000002 /* about to commit */

◆ SXACT_FLAG_READ_ONLY

#define SXACT_FLAG_READ_ONLY   0x00000020

◆ SXACT_FLAG_RO_SAFE

#define SXACT_FLAG_RO_SAFE   0x00000080

Definition at line 130 of file predicate_internals.h.

Referenced by ReleasePredicateLocks().

◆ SXACT_FLAG_RO_UNSAFE

#define SXACT_FLAG_RO_UNSAFE   0x00000100

Definition at line 131 of file predicate_internals.h.

Referenced by FlagSxactUnsafe().

◆ SXACT_FLAG_ROLLED_BACK

#define SXACT_FLAG_ROLLED_BACK   0x00000004 /* already rolled back */

Definition at line 120 of file predicate_internals.h.

Referenced by ReleasePredicateLocks().

◆ SXACT_FLAG_SUMMARY_CONFLICT_IN

#define SXACT_FLAG_SUMMARY_CONFLICT_IN   0x00000200

◆ SXACT_FLAG_SUMMARY_CONFLICT_OUT

#define SXACT_FLAG_SUMMARY_CONFLICT_OUT   0x00000400

Typedef Documentation

◆ LOCALPREDICATELOCK

◆ PREDICATELOCK

typedef struct PREDICATELOCK PREDICATELOCK

◆ PredicateLockData

◆ PREDICATELOCKTAG

◆ PREDICATELOCKTARGET

◆ PREDICATELOCKTARGETTAG

◆ PredicateLockTargetType

◆ PredXactList

typedef struct PredXactListData* PredXactList

Definition at line 192 of file predicate_internals.h.

◆ PredXactListData

◆ PredXactListElement

Definition at line 154 of file predicate_internals.h.

◆ PredXactListElementData

◆ RWConflict

typedef struct RWConflictData* RWConflict

Definition at line 216 of file predicate_internals.h.

◆ RWConflictData

◆ RWConflictPoolHeader

Definition at line 227 of file predicate_internals.h.

◆ RWConflictPoolHeaderData

◆ SerCommitSeqNo

typedef uint64 SerCommitSeqNo

Definition at line 23 of file predicate_internals.h.

◆ SERIALIZABLEXACT

◆ SERIALIZABLEXID

◆ SERIALIZABLEXIDTAG

◆ TwoPhasePredicateLockRecord

◆ TwoPhasePredicateRecord

◆ TwoPhasePredicateRecordType

◆ TwoPhasePredicateXactRecord

Enumeration Type Documentation

◆ PredicateLockTargetType

Enumerator
PREDLOCKTAG_RELATION 
PREDLOCKTAG_PAGE 
PREDLOCKTAG_TUPLE 

Definition at line 376 of file predicate_internals.h.

377 {
381  /* TODO SSI: Other types may be needed for index locking */
PredicateLockTargetType

◆ TwoPhasePredicateRecordType

Enumerator
TWOPHASEPREDICATERECORD_XACT 
TWOPHASEPREDICATERECORD_LOCK 

Definition at line 439 of file predicate_internals.h.

Function Documentation

◆ GetPredicateLockStatusData()

PredicateLockData* GetPredicateLockStatusData ( void  )

Definition at line 1443 of file predicate.c.

References Assert, hash_get_num_entries(), hash_seq_init(), hash_seq_search(), i, PredicateLockData::locktags, LW_SHARED, LWLockAcquire(), LWLockRelease(), PREDICATELOCKTAG::myTarget, PREDICATELOCKTAG::myXact, PredicateLockData::nelements, NUM_PREDICATELOCK_PARTITIONS, palloc(), PredicateLockHashPartitionLockByIndex, PREDICATELOCKTARGET::tag, PREDICATELOCK::tag, and PredicateLockData::xacts.

Referenced by pg_lock_status().

1444 {
1445  PredicateLockData *data;
1446  int i;
1447  int els,
1448  el;
1449  HASH_SEQ_STATUS seqstat;
1450  PREDICATELOCK *predlock;
1451 
1452  data = (PredicateLockData *) palloc(sizeof(PredicateLockData));
1453 
1454  /*
1455  * To ensure consistency, take simultaneous locks on all partition locks
1456  * in ascending order, then SerializableXactHashLock.
1457  */
1458  for (i = 0; i < NUM_PREDICATELOCK_PARTITIONS; i++)
1460  LWLockAcquire(SerializableXactHashLock, LW_SHARED);
1461 
1462  /* Get number of locks and allocate appropriately-sized arrays. */
1464  data->nelements = els;
1465  data->locktags = (PREDICATELOCKTARGETTAG *)
1466  palloc(sizeof(PREDICATELOCKTARGETTAG) * els);
1467  data->xacts = (SERIALIZABLEXACT *)
1468  palloc(sizeof(SERIALIZABLEXACT) * els);
1469 
1470 
1471  /* Scan through PredicateLockHash and copy contents */
1472  hash_seq_init(&seqstat, PredicateLockHash);
1473 
1474  el = 0;
1475 
1476  while ((predlock = (PREDICATELOCK *) hash_seq_search(&seqstat)))
1477  {
1478  data->locktags[el] = predlock->tag.myTarget->tag;
1479  data->xacts[el] = *predlock->tag.myXact;
1480  el++;
1481  }
1482 
1483  Assert(el == els);
1484 
1485  /* Release locks in reverse order */
1486  LWLockRelease(SerializableXactHashLock);
1487  for (i = NUM_PREDICATELOCK_PARTITIONS - 1; i >= 0; i--)
1489 
1490  return data;
1491 }
long hash_get_num_entries(HTAB *hashp)
Definition: dynahash.c:1382
SERIALIZABLEXACT * xacts
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1803
static HTAB * PredicateLockHash
Definition: predicate.c:393
PREDICATELOCKTARGETTAG * locktags
PREDICATELOCKTAG tag
PREDICATELOCKTARGETTAG tag
#define Assert(condition)
Definition: c.h:804
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1199
void * hash_seq_search(HASH_SEQ_STATUS *status)
Definition: dynahash.c:1436
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
Definition: dynahash.c:1426
#define PredicateLockHashPartitionLockByIndex(i)
Definition: predicate.c:256
void * palloc(Size size)
Definition: mcxt.c:1062
int i
SERIALIZABLEXACT * myXact
PREDICATELOCKTARGET * myTarget
#define NUM_PREDICATELOCK_PARTITIONS
Definition: lwlock.h:91

◆ GetSafeSnapshotBlockingPids()

int GetSafeSnapshotBlockingPids ( int  blocked_pid,
int *  output,
int  output_size 
)

Definition at line 1628 of file predicate.c.

References FirstPredXact(), RWConflictData::inLink, LW_SHARED, LWLockAcquire(), LWLockRelease(), NextPredXact(), offsetof, SERIALIZABLEXACT::pid, SERIALIZABLEXACT::possibleUnsafeConflicts, SHMQueueNext(), SxactIsDeferrableWaiting, and RWConflictData::sxactOut.

Referenced by pg_isolation_test_session_is_blocked(), and pg_safe_snapshot_blocking_pids().

1629 {
1630  int num_written = 0;
1631  SERIALIZABLEXACT *sxact;
1632 
1633  LWLockAcquire(SerializableXactHashLock, LW_SHARED);
1634 
1635  /* Find blocked_pid's SERIALIZABLEXACT by linear search. */
1636  for (sxact = FirstPredXact(); sxact != NULL; sxact = NextPredXact(sxact))
1637  {
1638  if (sxact->pid == blocked_pid)
1639  break;
1640  }
1641 
1642  /* Did we find it, and is it currently waiting in GetSafeSnapshot? */
1643  if (sxact != NULL && SxactIsDeferrableWaiting(sxact))
1644  {
1645  RWConflict possibleUnsafeConflict;
1646 
1647  /* Traverse the list of possible unsafe conflicts collecting PIDs. */
1648  possibleUnsafeConflict = (RWConflict)
1650  &sxact->possibleUnsafeConflicts,
1651  offsetof(RWConflictData, inLink));
1652 
1653  while (possibleUnsafeConflict != NULL && num_written < output_size)
1654  {
1655  output[num_written++] = possibleUnsafeConflict->sxactOut->pid;
1656  possibleUnsafeConflict = (RWConflict)
1658  &possibleUnsafeConflict->inLink,
1659  offsetof(RWConflictData, inLink));
1660  }
1661  }
1662 
1663  LWLockRelease(SerializableXactHashLock);
1664 
1665  return num_written;
1666 }
static void output(uint64 loop_count)
struct RWConflictData * RWConflict
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1803
SHM_QUEUE possibleUnsafeConflicts
static SERIALIZABLEXACT * NextPredXact(SERIALIZABLEXACT *sxact)
Definition: predicate.c:627
static SERIALIZABLEXACT * FirstPredXact(void)
Definition: predicate.c:612
Pointer SHMQueueNext(const SHM_QUEUE *queue, const SHM_QUEUE *curElem, Size linkOffset)
Definition: shmqueue.c:145
#define SxactIsDeferrableWaiting(sxact)
Definition: predicate.c:285
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1199
#define offsetof(type, field)
Definition: c.h:727
SERIALIZABLEXACT * sxactOut