mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Make non-MVCC snapshots exempt from predicate locking. Scans with non-MVCC
snapshots, like in REINDEX, are basically non-transactional operations. The DDL operation itself might participate in SSI, but there's separate functions for that. Kevin Grittner and Dan Ports, with some changes by me.
This commit is contained in:
@@ -126,7 +126,7 @@ do { \
|
||||
} while(0)
|
||||
|
||||
static IndexScanDesc index_beginscan_internal(Relation indexRelation,
|
||||
int nkeys, int norderbys);
|
||||
int nkeys, int norderbys, Snapshot snapshot);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
@@ -234,7 +234,7 @@ index_beginscan(Relation heapRelation,
|
||||
{
|
||||
IndexScanDesc scan;
|
||||
|
||||
scan = index_beginscan_internal(indexRelation, nkeys, norderbys);
|
||||
scan = index_beginscan_internal(indexRelation, nkeys, norderbys, snapshot);
|
||||
|
||||
/*
|
||||
* Save additional parameters into the scandesc. Everything else was set
|
||||
@@ -259,7 +259,7 @@ index_beginscan_bitmap(Relation indexRelation,
|
||||
{
|
||||
IndexScanDesc scan;
|
||||
|
||||
scan = index_beginscan_internal(indexRelation, nkeys, 0);
|
||||
scan = index_beginscan_internal(indexRelation, nkeys, 0, snapshot);
|
||||
|
||||
/*
|
||||
* Save additional parameters into the scandesc. Everything else was set
|
||||
@@ -275,7 +275,7 @@ index_beginscan_bitmap(Relation indexRelation,
|
||||
*/
|
||||
static IndexScanDesc
|
||||
index_beginscan_internal(Relation indexRelation,
|
||||
int nkeys, int norderbys)
|
||||
int nkeys, int norderbys, Snapshot snapshot)
|
||||
{
|
||||
IndexScanDesc scan;
|
||||
FmgrInfo *procedure;
|
||||
@@ -284,7 +284,7 @@ index_beginscan_internal(Relation indexRelation,
|
||||
GET_REL_PROCEDURE(ambeginscan);
|
||||
|
||||
if (!(indexRelation->rd_am->ampredlocks))
|
||||
PredicateLockRelation(indexRelation);
|
||||
PredicateLockRelation(indexRelation, snapshot);
|
||||
|
||||
/*
|
||||
* We hold a reference count to the relcache entry throughout the scan.
|
||||
@@ -602,7 +602,8 @@ index_getnext(IndexScanDesc scan, ScanDirection direction)
|
||||
scan->xs_cbuf);
|
||||
|
||||
CheckForSerializableConflictOut(valid, scan->heapRelation,
|
||||
heapTuple, scan->xs_cbuf);
|
||||
heapTuple, scan->xs_cbuf,
|
||||
scan->xs_snapshot);
|
||||
|
||||
if (valid)
|
||||
{
|
||||
@@ -624,7 +625,7 @@ index_getnext(IndexScanDesc scan, ScanDirection direction)
|
||||
else
|
||||
scan->xs_next_hot = InvalidOffsetNumber;
|
||||
|
||||
PredicateLockTuple(scan->heapRelation, heapTuple);
|
||||
PredicateLockTuple(scan->heapRelation, heapTuple, scan->xs_snapshot);
|
||||
|
||||
LockBuffer(scan->xs_cbuf, BUFFER_LOCK_UNLOCK);
|
||||
|
||||
|
Reference in New Issue
Block a user