PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
predicate_internals.h File Reference
#include "storage/lock.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 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
PredXactListElementData
PredXactListElement
 
typedef struct PredXactListData PredXactListData
 
typedef struct PredXactListDataPredXactList
 
typedef struct RWConflictData RWConflictData
 
typedef struct RWConflictDataRWConflict
 
typedef struct
RWConflictPoolHeaderData 
RWConflictPoolHeaderData
 
typedef struct
RWConflictPoolHeaderData
RWConflictPoolHeader
 
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

#define FirstNormalSerCommitSeqNo   ((SerCommitSeqNo) 2)

Definition at line 38 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and ReleasePredicateLocks().

#define GET_PREDICATELOCKTARGETTAG_DB (   locktag)    ((Oid) (locktag).locktag_field1)
#define GET_PREDICATELOCKTARGETTAG_OFFSET (   locktag)    ((OffsetNumber) (locktag).locktag_field4)

Definition at line 413 of file predicate_internals.h.

Referenced by CheckTargetForConflictsIn(), and pg_lock_status().

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

Definition at line 411 of file predicate_internals.h.

Referenced by GetParentPredicateLockTag(), and pg_lock_status().

#define GET_PREDICATELOCKTARGETTAG_RELATION (   locktag)    ((Oid) (locktag).locktag_field2)
#define GET_PREDICATELOCKTARGETTAG_TYPE (   locktag)
#define PredXactListDataSize   ((Size)MAXALIGN(sizeof(PredXactListData)))

Definition at line 180 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

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

Definition at line 142 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

#define RecoverySerCommitSeqNo   ((SerCommitSeqNo) 1)

Definition at line 37 of file predicate_internals.h.

Referenced by predicatelock_twophase_recover().

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

Definition at line 204 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

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

Definition at line 215 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and PredicateLockShmemSize().

#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 395 of file predicate_internals.h.

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

#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 389 of file predicate_internals.h.

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

#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 401 of file predicate_internals.h.

Referenced by CheckForSerializableConflictIn(), and PredicateLockTuple().

#define SXACT_FLAG_COMMITTED   0x00000001 /* already committed */

Definition at line 110 of file predicate_internals.h.

Referenced by InitPredicateLocks(), and ReleasePredicateLocks().

#define SXACT_FLAG_CONFLICT_OUT   0x00000010

Definition at line 119 of file predicate_internals.h.

Referenced by ReleasePredicateLocks().

#define SXACT_FLAG_DEFERRABLE_WAITING   0x00000040

Definition at line 121 of file predicate_internals.h.

Referenced by GetSafeSnapshot().

#define SXACT_FLAG_DOOMED   0x00000008 /* will roll back */
#define SXACT_FLAG_PREPARED   0x00000002 /* about to commit */
#define SXACT_FLAG_READ_ONLY   0x00000020
#define SXACT_FLAG_RO_SAFE   0x00000080

Definition at line 122 of file predicate_internals.h.

Referenced by ReleasePredicateLocks().

#define SXACT_FLAG_RO_UNSAFE   0x00000100

Definition at line 123 of file predicate_internals.h.

Referenced by FlagSxactUnsafe().

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

Definition at line 112 of file predicate_internals.h.

Referenced by ReleasePredicateLocks().

#define SXACT_FLAG_SUMMARY_CONFLICT_IN   0x00000200
#define SXACT_FLAG_SUMMARY_CONFLICT_OUT   0x00000400

Typedef Documentation

Definition at line 178 of file predicate_internals.h.

Definition at line 202 of file predicate_internals.h.

Definition at line 22 of file predicate_internals.h.

Enumeration Type Documentation

Enumerator
PREDLOCKTAG_RELATION 
PREDLOCKTAG_PAGE 
PREDLOCKTAG_TUPLE 

Definition at line 362 of file predicate_internals.h.

363 {
367  /* TODO SSI: Other types may be needed for index locking */
PredicateLockTargetType
Enumerator
TWOPHASEPREDICATERECORD_XACT 
TWOPHASEPREDICATERECORD_LOCK 

Definition at line 425 of file predicate_internals.h.

Function Documentation

PredicateLockData* GetPredicateLockStatusData ( void  )

Definition at line 1384 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().

1385 {
1386  PredicateLockData *data;
1387  int i;
1388  int els,
1389  el;
1390  HASH_SEQ_STATUS seqstat;
1391  PREDICATELOCK *predlock;
1392 
1393  data = (PredicateLockData *) palloc(sizeof(PredicateLockData));
1394 
1395  /*
1396  * To ensure consistency, take simultaneous locks on all partition locks
1397  * in ascending order, then SerializableXactHashLock.
1398  */
1399  for (i = 0; i < NUM_PREDICATELOCK_PARTITIONS; i++)
1401  LWLockAcquire(SerializableXactHashLock, LW_SHARED);
1402 
1403  /* Get number of locks and allocate appropriately-sized arrays. */
1405  data->nelements = els;
1406  data->locktags = (PREDICATELOCKTARGETTAG *)
1407  palloc(sizeof(PREDICATELOCKTARGETTAG) * els);
1408  data->xacts = (SERIALIZABLEXACT *)
1409  palloc(sizeof(SERIALIZABLEXACT) * els);
1410 
1411 
1412  /* Scan through PredicateLockHash and copy contents */
1413  hash_seq_init(&seqstat, PredicateLockHash);
1414 
1415  el = 0;
1416 
1417  while ((predlock = (PREDICATELOCK *) hash_seq_search(&seqstat)))
1418  {
1419  data->locktags[el] = predlock->tag.myTarget->tag;
1420  data->xacts[el] = *predlock->tag.myXact;
1421  el++;
1422  }
1423 
1424  Assert(el == els);
1425 
1426  /* Release locks in reverse order */
1427  LWLockRelease(SerializableXactHashLock);
1428  for (i = NUM_PREDICATELOCK_PARTITIONS - 1; i >= 0; i--)
1430 
1431  return data;
1432 }
long hash_get_num_entries(HTAB *hashp)
Definition: dynahash.c:1297
SERIALIZABLEXACT * xacts
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1715
static HTAB * PredicateLockHash
Definition: predicate.c:388
PREDICATELOCKTARGETTAG * locktags
PREDICATELOCKTAG tag
PREDICATELOCKTARGETTAG tag
#define Assert(condition)
Definition: c.h:675
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1111
void * hash_seq_search(HASH_SEQ_STATUS *status)
Definition: dynahash.c:1351
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
Definition: dynahash.c:1341
#define PredicateLockHashPartitionLockByIndex(i)
Definition: predicate.c:248
void * palloc(Size size)
Definition: mcxt.c:849
int i
SERIALIZABLEXACT * myXact
PREDICATELOCKTARGET * myTarget
#define NUM_PREDICATELOCK_PARTITIONS
Definition: lwlock.h:121
int GetSafeSnapshotBlockingPids ( int  blocked_pid,
int *  output,
int  output_size 
)

Definition at line 1569 of file predicate.c.

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

Referenced by pg_isolation_test_session_is_blocked(), and pg_safe_snapshot_blocking_pids().

1570 {
1571  int num_written = 0;
1572  SERIALIZABLEXACT *sxact;
1573 
1574  LWLockAcquire(SerializableXactHashLock, LW_SHARED);
1575 
1576  /* Find blocked_pid's SERIALIZABLEXACT by linear search. */
1577  for (sxact = FirstPredXact(); sxact != NULL; sxact = NextPredXact(sxact))
1578  {
1579  if (sxact->pid == blocked_pid)
1580  break;
1581  }
1582 
1583  /* Did we find it, and is it currently waiting in GetSafeSnapshot? */
1584  if (sxact != NULL && SxactIsDeferrableWaiting(sxact))
1585  {
1586  RWConflict possibleUnsafeConflict;
1587 
1588  /* Traverse the list of possible unsafe conflicts collecting PIDs. */
1589  possibleUnsafeConflict = (RWConflict)
1591  &sxact->possibleUnsafeConflicts,
1592  offsetof(RWConflictData, inLink));
1593 
1594  while (possibleUnsafeConflict != NULL && num_written < output_size)
1595  {
1596  output[num_written++] = possibleUnsafeConflict->sxactOut->pid;
1597  possibleUnsafeConflict = (RWConflict)
1599  &possibleUnsafeConflict->inLink,
1600  offsetof(RWConflictData, inLink));
1601  }
1602  }
1603 
1604  LWLockRelease(SerializableXactHashLock);
1605 
1606  return num_written;
1607 }
static void output(uint64 loop_count)
struct RWConflictData * RWConflict
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1715
SHM_QUEUE possibleUnsafeConflicts
static SERIALIZABLEXACT * NextPredXact(SERIALIZABLEXACT *sxact)
Definition: predicate.c:611
static SERIALIZABLEXACT * FirstPredXact(void)
Definition: predicate.c:596
Pointer SHMQueueNext(const SHM_QUEUE *queue, const SHM_QUEUE *curElem, Size linkOffset)
Definition: shmqueue.c:145
#define NULL
Definition: c.h:229
#define SxactIsDeferrableWaiting(sxact)
Definition: predicate.c:277
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1111
#define offsetof(type, field)
Definition: c.h:555
SERIALIZABLEXACT * sxactOut