Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit bcc93a3

Browse files
committed
Fix race in SSI interaction with bitmap heap scan.
When performing a bitmap heap scan, we don't want to miss concurrent writes that occurred after we observed the heap's rs_nblocks, but before we took predicate locks on index pages. Therefore, we can't skip fetching any heap tuples that are referenced by the index, because we need to test them all with CheckForSerializableConflictOut(). The old optimization that would ignore any references to blocks >= rs_nblocks gets in the way of that requirement, because it means that concurrent writes in that window are ignored. Removing that optimization shouldn't affect correctness at any isolation level, because any new tuples shouldn't be visible to an MVCC snapshot. There also shouldn't be any error-causing references to heap blocks past the end, because we should have held at least an AccessShareLock on the table before the index scan. It can't get smaller while our transaction is running. For now, though, we'll keep the optimization at lower levels to avoid making unnecessary changes in a bug fix. Back-patch to all supported releases. In release 11, the code is in a different place but not fundamentally different. Fixes one aspect of bug #17949. Reported-by: Artem Anisimov <artem.anisimov.255@gmail.com> Reviewed-by: Dmitry Dolgov <9erthalion6@gmail.com> Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi> Discussion: https://postgr.es/m/17949-a0f17035294a55e2%40postgresql.org
1 parent f9b7fc6 commit bcc93a3

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/backend/access/heap/heapam_handler.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2132,9 +2132,11 @@ heapam_scan_bitmap_next_block(TableScanDesc scan,
21322132
* Ignore any claimed entries past what we think is the end of the
21332133
* relation. It may have been extended after the start of our scan (we
21342134
* only hold an AccessShareLock, and it could be inserts from this
2135-
* backend).
2135+
* backend). We don't take this optimization in SERIALIZABLE isolation
2136+
* though, as we need to examine all invisible tuples reachable by the
2137+
* index.
21362138
*/
2137-
if (block >= hscan->rs_nblocks)
2139+
if (!IsolationIsSerializable() && block >= hscan->rs_nblocks)
21382140
return false;
21392141

21402142
/*

0 commit comments

Comments
 (0)