|
|
|
@ -14,6 +14,7 @@ |
|
|
|
#ifndef PREDICATE_INTERNALS_H |
|
|
|
#ifndef PREDICATE_INTERNALS_H |
|
|
|
#define PREDICATE_INTERNALS_H |
|
|
|
#define PREDICATE_INTERNALS_H |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "lib/ilist.h" |
|
|
|
#include "storage/lock.h" |
|
|
|
#include "storage/lock.h" |
|
|
|
#include "storage/lwlock.h" |
|
|
|
#include "storage/lwlock.h" |
|
|
|
|
|
|
|
|
|
|
|
@ -84,13 +85,14 @@ typedef struct SERIALIZABLEXACT |
|
|
|
SerCommitSeqNo lastCommitBeforeSnapshot; /* when not committed or
|
|
|
|
SerCommitSeqNo lastCommitBeforeSnapshot; /* when not committed or
|
|
|
|
* no conflict out */ |
|
|
|
* no conflict out */ |
|
|
|
} SeqNo; |
|
|
|
} SeqNo; |
|
|
|
SHM_QUEUE outConflicts; /* list of write transactions whose data we
|
|
|
|
dlist_head outConflicts; /* list of write transactions whose data we
|
|
|
|
* couldn't read. */ |
|
|
|
* couldn't read. */ |
|
|
|
SHM_QUEUE inConflicts; /* list of read transactions which couldn't
|
|
|
|
dlist_head inConflicts; /* list of read transactions which couldn't
|
|
|
|
* see our write. */ |
|
|
|
* see our write. */ |
|
|
|
SHM_QUEUE predicateLocks; /* list of associated PREDICATELOCK objects */ |
|
|
|
dlist_head predicateLocks; /* list of associated PREDICATELOCK objects */ |
|
|
|
SHM_QUEUE finishedLink; /* list link in
|
|
|
|
dlist_node finishedLink; /* list link in
|
|
|
|
* FinishedSerializableTransactions */ |
|
|
|
* FinishedSerializableTransactions */ |
|
|
|
|
|
|
|
dlist_node xactLink; /* PredXact->activeList/availableList */ |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* perXactPredicateListLock is only used in parallel queries: it protects |
|
|
|
* perXactPredicateListLock is only used in parallel queries: it protects |
|
|
|
@ -103,7 +105,7 @@ typedef struct SERIALIZABLEXACT |
|
|
|
* for r/o transactions: list of concurrent r/w transactions that we could |
|
|
|
* for r/o transactions: list of concurrent r/w transactions that we could |
|
|
|
* potentially have conflicts with, and vice versa for r/w transactions |
|
|
|
* potentially have conflicts with, and vice versa for r/w transactions |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
SHM_QUEUE possibleUnsafeConflicts; |
|
|
|
dlist_head possibleUnsafeConflicts; |
|
|
|
|
|
|
|
|
|
|
|
TransactionId topXid; /* top level xid for the transaction, if one
|
|
|
|
TransactionId topXid; /* top level xid for the transaction, if one
|
|
|
|
* exists; else invalid */ |
|
|
|
* exists; else invalid */ |
|
|
|
@ -139,28 +141,10 @@ typedef struct SERIALIZABLEXACT |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
#define SXACT_FLAG_PARTIALLY_RELEASED 0x00000800 |
|
|
|
#define SXACT_FLAG_PARTIALLY_RELEASED 0x00000800 |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* The following types are used to provide an ad hoc list for holding |
|
|
|
|
|
|
|
* SERIALIZABLEXACT objects. An HTAB is overkill, since there is no need to |
|
|
|
|
|
|
|
* access these by key -- there are direct pointers to these objects where |
|
|
|
|
|
|
|
* needed. If a shared memory list is created, these types can probably be |
|
|
|
|
|
|
|
* eliminated in favor of using the general solution. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
typedef struct PredXactListElementData |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
SHM_QUEUE link; |
|
|
|
|
|
|
|
SERIALIZABLEXACT sxact; |
|
|
|
|
|
|
|
} PredXactListElementData; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct PredXactListElementData *PredXactListElement; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define PredXactListElementDataSize \ |
|
|
|
|
|
|
|
((Size)MAXALIGN(sizeof(PredXactListElementData))) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct PredXactListData |
|
|
|
typedef struct PredXactListData |
|
|
|
{ |
|
|
|
{ |
|
|
|
SHM_QUEUE availableList; |
|
|
|
dlist_head availableList; |
|
|
|
SHM_QUEUE activeList; |
|
|
|
dlist_head activeList; |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* These global variables are maintained when registering and cleaning up |
|
|
|
* These global variables are maintained when registering and cleaning up |
|
|
|
@ -187,7 +171,7 @@ typedef struct PredXactListData |
|
|
|
* seq no */ |
|
|
|
* seq no */ |
|
|
|
SERIALIZABLEXACT *OldCommittedSxact; /* shared copy of dummy sxact */ |
|
|
|
SERIALIZABLEXACT *OldCommittedSxact; /* shared copy of dummy sxact */ |
|
|
|
|
|
|
|
|
|
|
|
PredXactListElement element; |
|
|
|
SERIALIZABLEXACT *element; |
|
|
|
} PredXactListData; |
|
|
|
} PredXactListData; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct PredXactListData *PredXactList; |
|
|
|
typedef struct PredXactListData *PredXactList; |
|
|
|
@ -208,8 +192,8 @@ typedef struct PredXactListData *PredXactList; |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
typedef struct RWConflictData |
|
|
|
typedef struct RWConflictData |
|
|
|
{ |
|
|
|
{ |
|
|
|
SHM_QUEUE outLink; /* link for list of conflicts out from a sxact */ |
|
|
|
dlist_node outLink; /* link for list of conflicts out from a sxact */ |
|
|
|
SHM_QUEUE inLink; /* link for list of conflicts in to a sxact */ |
|
|
|
dlist_node inLink; /* link for list of conflicts in to a sxact */ |
|
|
|
SERIALIZABLEXACT *sxactOut; |
|
|
|
SERIALIZABLEXACT *sxactOut; |
|
|
|
SERIALIZABLEXACT *sxactIn; |
|
|
|
SERIALIZABLEXACT *sxactIn; |
|
|
|
} RWConflictData; |
|
|
|
} RWConflictData; |
|
|
|
@ -221,7 +205,7 @@ typedef struct RWConflictData *RWConflict; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct RWConflictPoolHeaderData |
|
|
|
typedef struct RWConflictPoolHeaderData |
|
|
|
{ |
|
|
|
{ |
|
|
|
SHM_QUEUE availableList; |
|
|
|
dlist_head availableList; |
|
|
|
RWConflict element; |
|
|
|
RWConflict element; |
|
|
|
} RWConflictPoolHeaderData; |
|
|
|
} RWConflictPoolHeaderData; |
|
|
|
|
|
|
|
|
|
|
|
@ -303,7 +287,7 @@ typedef struct PREDICATELOCKTARGET |
|
|
|
PREDICATELOCKTARGETTAG tag; /* unique identifier of lockable object */ |
|
|
|
PREDICATELOCKTARGETTAG tag; /* unique identifier of lockable object */ |
|
|
|
|
|
|
|
|
|
|
|
/* data */ |
|
|
|
/* data */ |
|
|
|
SHM_QUEUE predicateLocks; /* list of PREDICATELOCK objects assoc. with
|
|
|
|
dlist_head predicateLocks; /* list of PREDICATELOCK objects assoc. with
|
|
|
|
* predicate lock target */ |
|
|
|
* predicate lock target */ |
|
|
|
} PREDICATELOCKTARGET; |
|
|
|
} PREDICATELOCKTARGET; |
|
|
|
|
|
|
|
|
|
|
|
@ -336,9 +320,9 @@ typedef struct PREDICATELOCK |
|
|
|
PREDICATELOCKTAG tag; /* unique identifier of lock */ |
|
|
|
PREDICATELOCKTAG tag; /* unique identifier of lock */ |
|
|
|
|
|
|
|
|
|
|
|
/* data */ |
|
|
|
/* data */ |
|
|
|
SHM_QUEUE targetLink; /* list link in PREDICATELOCKTARGET's list of
|
|
|
|
dlist_node targetLink; /* list link in PREDICATELOCKTARGET's list of
|
|
|
|
* predicate locks */ |
|
|
|
* predicate locks */ |
|
|
|
SHM_QUEUE xactLink; /* list link in SERIALIZABLEXACT's list of
|
|
|
|
dlist_node xactLink; /* list link in SERIALIZABLEXACT's list of
|
|
|
|
* predicate locks */ |
|
|
|
* predicate locks */ |
|
|
|
SerCommitSeqNo commitSeqNo; /* only used for summarized predicate locks */ |
|
|
|
SerCommitSeqNo commitSeqNo; /* only used for summarized predicate locks */ |
|
|
|
} PREDICATELOCK; |
|
|
|
} PREDICATELOCK; |
|
|
|
|