Re: BitmapHeapScan streaming read user and prelim refactoring
Tomas Vondra <tomas.vondra@enterprisedb.com>
Attachments
- v14-0001-BitmapHeapScan-begin-scan-after-bitmap-creation.patch (text/x-patch) patch v14-0001
- v14-0002-review.patch (text/x-patch) patch v14-0002
- v14-0003-BitmapHeapScan-set-can_skip_fetch-later.patch (text/x-patch) patch v14-0003
- v14-0004-Push-BitmapHeapScan-skip-fetch-optimization-into.patch (text/x-patch) patch v14-0004
- v14-0005-BitmapPrefetch-use-prefetch-block-recheck-for-sk.patch (text/x-patch) patch v14-0005
- v14-0006-Update-BitmapAdjustPrefetchIterator-parameter-ty.patch (text/x-patch) patch v14-0006
- v14-0007-table_scan_bitmap_next_block-returns-lossy-or-ex.patch (text/x-patch) patch v14-0007
- v14-0008-review.patch (text/x-patch) patch v14-0008
- v14-0009-Reduce-scope-of-BitmapHeapScan-tbmiterator-local.patch (text/x-patch) patch v14-0009
- v14-0010-review.patch (text/x-patch) patch v14-0010
- v14-0011-Remove-table_scan_bitmap_next_tuple-parameter-tb.patch (text/x-patch) patch v14-0011
- v14-0012-Make-table_scan_bitmap_next_block-async-friendly.patch (text/x-patch) patch v14-0012
- v14-0013-Unify-parallel-and-serial-BitmapHeapScan-iterato.patch (text/x-patch) patch v14-0013
- v14-0014-table_scan_bitmap_next_block-counts-lossy-and-ex.patch (text/x-patch) patch v14-0014
- v14-0015-Hard-code-TBMIterateResult-offsets-array-size.patch (text/x-patch) patch v14-0015
- v14-0016-Separate-TBM-Shared-Iterator-and-TBMIterateResul.patch (text/x-patch) patch v14-0016
- v14-0017-Push-BitmapHeapScan-prefetch-code-into-heapam.c.patch (text/x-patch) patch v14-0017
- v14-0018-Remove-table_scan_bitmap_next_block.patch (text/x-patch) patch v14-0018
- v14-0019-BitmapHeapScan-uses-read-stream-API.patch (text/x-patch) patch v14-0019
On 4/4/24 00:57, Melanie Plageman wrote: > On Sun, Mar 31, 2024 at 11:45:51AM -0400, Melanie Plageman wrote: >> On Fri, Mar 29, 2024 at 12:05:15PM +0100, Tomas Vondra wrote: >>> >>> >>> On 3/29/24 02:12, Thomas Munro wrote: >>>> On Fri, Mar 29, 2024 at 10:43 AM Tomas Vondra >>>> <tomas.vondra@enterprisedb.com> wrote: >>>>> I think there's some sort of bug, triggering this assert in heapam >>>>> >>>>> Assert(BufferGetBlockNumber(hscan->rs_cbuf) == tbmres->blockno); >>>> >>>> Thanks for the repro. I can't seem to reproduce it (still trying) but >>>> I assume this is with Melanie's v11 patch set which had >>>> v11-0016-v10-Read-Stream-API.patch. >>>> >>>> Would you mind removing that commit and instead applying the v13 >>>> stream_read.c patches[1]? v10 stream_read.c was a little confused >>>> about random I/O combining, which I fixed with a small adjustment to >>>> the conditions for the "if" statement right at the end of >>>> read_stream_look_ahead(). Sorry about that. The fixed version, with >>>> eic=4, with your test query using WHERE a < a, ends its scan with: >>>> >>> >>> I'll give that a try. Unfortunately unfortunately the v11 still has the >>> problem I reported about a week ago: >>> >>> ERROR: prefetch and main iterators are out of sync >>> >>> So I can't run the full benchmarks :-( but master vs. streaming read API >>> should work, I think. >> >> Odd, I didn't notice you reporting this ERROR popping up. Now that I >> take a look, v11 (at least, maybe also v10) had this very sill mistake: >> >> if (scan->bm_parallel == NULL && >> scan->rs_pf_bhs_iterator && >> hscan->pfblockno > hscan->rs_base.blockno) >> elog(ERROR, "prefetch and main iterators are out of sync"); >> >> It errors out if the prefetch block is ahead of the current block -- >> which is the opposite of what we want. I've fixed this in attached v12. >> >> This version also has v13 of the streaming read API. I noticed one >> mistake in my bitmapheap scan streaming read user -- it freed the >> streaming read object at the wrong time. I don't know if this was >> causing any other issues, but it at least is fixed in this version. > > Attached v13 is rebased over master (which includes the streaming read > API now). I also reset the streaming read object on rescan instead of > creating a new one each time. > > I don't know how much chance any of this has of going in to 17 now, but > I thought I would start looking into the regression repro Tomas provided > in [1]. > My personal opinion is that we should try to get in as many of the the refactoring patches as possible, but I think it's probably too late for the actual switch to the streaming API. If someone else feels like committing that part, I won't stand in the way, but I'm not quite convinced it won't cause regressions. Maybe it's OK but I'd need more time to do more tests, collect data, and so on. And I don't think we have that, especially considering we'd still need to commit the other parts first. > I'm also not sure if I should try and group the commits into fewer > commits now or wait until I have some idea of whether or not the > approach in 0013 and 0014 is worth pursuing. > You mean whether to pursue the approach in general, or for v17? I think it looks like the right approach, but for v17 see above :-( As for merging, I wouldn't do that. I looked at the commits and while some of them seem somewhat "trivial", I really like how you organized the commits, and kept those that just "move" code around, and those that actually change stuff. It's much easier to understand, IMO. I went through the first ~10 commits, and added some review - either as a separate commit, when possible, in the code as XXX comment, and also in the commit message. The code tweaks are utterly trivial (whitespace or indentation to make the line shorter). It shouldn't take much time to deal with those, I think. I think the main focus should be updating the commit messages. If it was only a single patch, I'd probably try to write the messages myself, but with this many patches it'd be great if you could update those and I'll review that before commit. I always struggle with writing commit messages myself, and it takes me ages to write a good one (well, I think the message is good, but who knows ...). But I think a good message should be concise enough to explain what and why it's done. It may reference a thread for all the gory details, but the basic reasoning should be in the commit message. For example the message for "BitmapPrefetch use prefetch block recheck for skip fetch" now says that it "makes more sense to do X" but does not really say why that's the case. The linked message does, but it'd be good to have that in the message (because how would I know how much of the thread to read?). Also, it'd be very helpful if you could update the author & reviewed-by fields. I'll review those before commit, ofc, but I admit I lost track of who reviewed which part. I'd focus on the first ~8-9 commits or so for now, we can commit more if things go reasonably well. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Commits
-
Fix bitmapheapscan incorrect recheck of NULL tuples
- aea916fe555a 18.0 landed
-
Increase default maintenance_io_concurrency to 16
- cc6be07ebde2 18.0 landed
-
Separate TBM[Shared|Private]Iterator and TBMIterateResult
- 944e81bf99db 18.0 landed
-
Improve read_stream.c advice for dense streams.
- 7ea8cd15661e 18.0 landed
-
Increase default effective_io_concurrency to 16
- ff79b5b2aba0 18.0 landed
-
Delay extraction of TIDBitmap per page offsets
- bfe56cdf9a4e 18.0 landed
-
Add lossy indicator to TBMIterateResult
- b8778c4cd8bc 18.0 landed
-
Move BitmapTableScan per-scan setup into a helper
- a5358c14b2fe 18.0 landed
-
Add and use BitmapHeapScanDescData struct
- f7a8fc10ccb8 18.0 landed
-
Fix bitmap table scan crash on iterator release
- 754c610e13b8 18.0 landed
-
Bitmap Table Scans use unified TBMIterator
- 1a0da347a7ac 18.0 landed
-
Add common interface for TBMIterators
- 7f9d4187e7ba 18.0 landed
-
Make table_scan_bitmap_next_block() async-friendly
- de380a62b5da 18.0 landed
-
Move EXPLAIN counter increment to heapam_scan_bitmap_next_block
- 7bd7aa4d3067 18.0 landed
-
Refactor tidstore.c iterator buffering.
- f6bef362cac8 18.0 cited
-
BitmapHeapScan: Remove incorrect assert and reset field
- a3e6c6f92991 17.0 landed
-
Change BitmapAdjustPrefetchIterator to accept BlockNumber
- 92641d8d651e 17.0 landed
-
BitmapHeapScan: Use correct recheck flag for skip_fetch
- 1fdb0ce9b109 17.0 landed
-
BitmapHeapScan: Push skip_fetch optimization into table AM
- 04e72ed617be 17.0 landed
-
BitmapHeapScan: postpone setting can_skip_fetch
- fe1431e39cdd 17.0 landed
-
BitmapHeapScan: begin scan after bitmap creation
- 1577081e9614 17.0 landed
-
Fix EXPLAIN Bitmap heap scan to count pages with no visible tuples
- f3e4581acdc8 12.19 landed
- 992189a3e94d 13.15 landed
- 262757b73286 14.12 landed
- d3d95f583995 15.7 landed
- 1f4eb734200a 16.3 landed
- 0960ae1967d0 17.0 landed
-
Remove redundant snapshot copying from parallel leader to workers
- 84c18acaf690 17.0 landed
-
Remove some obsolete smgrcloseall() calls.
- 6a8ffe812d19 17.0 cited
-
Remove the "snapshot too old" feature.
- f691f5b80a85 17.0 cited
-
Compute XID horizon for page level index vacuum on primary.
- 558a9165e081 12.0 cited