diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-06-15 11:43:05 +0300 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-06-15 12:11:18 +0300 |
commit | 0a0e2b52a5a53b8747c165ff5c976f27df05a2e1 (patch) | |
tree | faddc252b3cbbff5a3ed961ae85816ca6334d356 /src/backend/access/heap/heapam.c | |
parent | 707195c8f487a39c34ea4d965140465594eb5c21 (diff) | |
download | postgresql-0a0e2b52a5a53b8747c165ff5c976f27df05a2e1.tar.gz postgresql-0a0e2b52a5a53b8747c165ff5c976f27df05a2e1.zip |
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.
Diffstat (limited to 'src/backend/access/heap/heapam.c')
-rw-r--r-- | src/backend/access/heap/heapam.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 01a492e496e..b947c11f7d8 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -274,7 +274,8 @@ heapgetpage(HeapScanDesc scan, BlockNumber page) else valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); - CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup, buffer); + CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup, + buffer, snapshot); if (valid) scan->rs_vistuples[ntup++] = lineoff; @@ -469,7 +470,8 @@ heapgettup(HeapScanDesc scan, snapshot, scan->rs_cbuf); - CheckForSerializableConflictOut(valid, scan->rs_rd, tuple, scan->rs_cbuf); + CheckForSerializableConflictOut(valid, scan->rs_rd, tuple, + scan->rs_cbuf, snapshot); if (valid && key != NULL) HeapKeyTest(tuple, RelationGetDescr(scan->rs_rd), @@ -478,7 +480,7 @@ heapgettup(HeapScanDesc scan, if (valid) { if (!scan->rs_relpredicatelocked) - PredicateLockTuple(scan->rs_rd, tuple); + PredicateLockTuple(scan->rs_rd, tuple, snapshot); LockBuffer(scan->rs_cbuf, BUFFER_LOCK_UNLOCK); return; } @@ -747,7 +749,7 @@ heapgettup_pagemode(HeapScanDesc scan, if (valid) { if (!scan->rs_relpredicatelocked) - PredicateLockTuple(scan->rs_rd, tuple); + PredicateLockTuple(scan->rs_rd, tuple, scan->rs_snapshot); scan->rs_cindex = lineindex; return; } @@ -755,7 +757,7 @@ heapgettup_pagemode(HeapScanDesc scan, else { if (!scan->rs_relpredicatelocked) - PredicateLockTuple(scan->rs_rd, tuple); + PredicateLockTuple(scan->rs_rd, tuple, scan->rs_snapshot); scan->rs_cindex = lineindex; return; } @@ -1470,9 +1472,9 @@ heap_fetch(Relation relation, valid = HeapTupleSatisfiesVisibility(tuple, snapshot, buffer); if (valid) - PredicateLockTuple(relation, tuple); + PredicateLockTuple(relation, tuple, snapshot); - CheckForSerializableConflictOut(valid, relation, tuple, buffer); + CheckForSerializableConflictOut(valid, relation, tuple, buffer, snapshot); LockBuffer(buffer, BUFFER_LOCK_UNLOCK); @@ -1588,11 +1590,12 @@ heap_hot_search_buffer(ItemPointer tid, Relation relation, Buffer buffer, /* If it's visible per the snapshot, we must return it */ valid = HeapTupleSatisfiesVisibility(&heapTuple, snapshot, buffer); - CheckForSerializableConflictOut(valid, relation, &heapTuple, buffer); + CheckForSerializableConflictOut(valid, relation, &heapTuple, buffer, + snapshot); if (valid) { ItemPointerSetOffsetNumber(tid, offnum); - PredicateLockTuple(relation, &heapTuple); + PredicateLockTuple(relation, &heapTuple, snapshot); if (all_dead) *all_dead = false; return true; @@ -1750,7 +1753,7 @@ heap_get_latest_tid(Relation relation, * result candidate. */ valid = HeapTupleSatisfiesVisibility(&tp, snapshot, buffer); - CheckForSerializableConflictOut(valid, relation, &tp, buffer); + CheckForSerializableConflictOut(valid, relation, &tp, buffer, snapshot); if (valid) *tid = ctid; |