Re: AIO v2.5
Andres Freund <andres@anarazel.de>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
aio: Fix assertion, clarify README
- 7b98c5536818 18.0 landed
- d3f97fd1dda3 19 (unreleased) landed
-
aio: Fix reference to outdated name
- f20a347e1a61 19 (unreleased) landed
- 95163cbe111c 18.0 landed
-
aio: Fix possible state confusions due to interrupt processing
- acad909321a4 18.0 landed
-
aio: Improve debug logging around waiting for IOs
- 039bfc457e43 18.0 landed
-
aio: Fix crash potential for pg_aios views due to late state update
- 0d9114b7040d 18.0 landed
-
Increase BAS_BULKREAD based on effective_io_concurrency
- 15f0cb26b530 18.0 landed
-
localbuf: Add Valgrind buffer access instrumentation
- 8ab4241b9f4f 18.0 landed
-
aio: Make AIO more compatible with valgrind
- 8e293e689bab 18.0 landed
-
aio: Avoid spurious coverity warning
- 57dec20fd469 18.0 landed
-
tests: Fix incompatibility of test_aio with *_FORCE_RELEASE
- a6285b150ad3 18.0 landed
-
tests: Cope with WARNINGs during failed CREATE DB on windows
- 43dca8a11624 18.0 landed
-
aio: Add errcontext for processing I/Os for another backend
- b3219c69fc1e 18.0 landed
-
aio: Add README.md explaining higher level design
- fdd146a8ef2b 18.0 landed
-
aio: Minor comment improvements
- e19dc74491e6 18.0 landed
-
aio: Add test_aio module
- 93bc3d75d8e1 18.0 landed
-
aio: Add pg_aios view
- 60f566b4f243 18.0 landed
-
docs: Add acronym and glossary entries for I/O and AIO
- 46250cdcb037 18.0 landed
-
Enable IO concurrency on all systems
- 2a5e709e721c 18.0 landed
-
read_stream: Introduce and use optional batchmode support
- ae3df4b34155 18.0 landed
-
docs: Reframe track_io_timing related docs as wait time
- b27f8637ea70 18.0 landed
-
bufmgr: Use AIO in StartReadBuffers()
- 12ce89fd0708 18.0 landed
-
bufmgr: Implement AIO read support
- 047cba7fa0f8 18.0 landed
-
aio: Add WARNING result status
- ef64fe26bad9 18.0 landed
-
Let caller of PageIsVerified() control ignore_checksum_failure
- d445990adc41 18.0 landed
-
pgstat: Allow checksum errors to be reported in critical sections
- b96d3c389755 18.0 landed
-
Add errhint_internal()
- 4244cf687697 18.0 landed
-
localbuf: Track pincount in BufferDesc as well
- d6d8054dc72d 18.0 landed
-
aio, bufmgr: Comment fixes/improvements
- 08ccd56ac765 18.0 landed
-
Fix mis-attribution of checksum failure stats to the wrong database
- dee80024688c 18.0 landed
-
aio: Implement support for reads in smgr/md/fd
- 50cb7505b301 18.0 landed
-
aio: Add io_method=io_uring
- c325a7633fcb 18.0 landed
-
aio: Add liburing dependency
- 8eadd5c73c44 18.0 landed
-
aio: Rename pgaio_io_prep_* to pgaio_io_start_*
- 9469d7fdd2bc 18.0 landed
-
aio: Pass result of local callbacks to ->report_return
- f321ec237a54 18.0 landed
-
aio: Be more paranoid about interrupts
- 96da9050a57a 18.0 landed
-
Redefine max_files_per_process to control additionally opened files
- adb5f85fa5a0 18.0 landed
-
aio: Change prefix of PgAioResultStatus values to PGAIO_RS_
- ca3067cc573d 18.0 landed
-
bufmgr: Improve stats when a buffer is read in concurrently
- 202b12774d09 18.0 landed
-
aio: Add io_method=worker
- 247ce06b883d 18.0 landed
-
aio: Infrastructure for io_method=worker
- 55b454d0e140 18.0 landed
-
aio: Add core asynchronous I/O infrastructure
- da7226993fd4 18.0 landed
-
aio: Basic subsystem initialization
- 02844012b304 18.0 landed
-
tests: Expand temp table tests to some pin related matters
- 1a22a8a0f131 18.0 landed
-
localbuf: Introduce FlushLocalBuffer()
- 4b4d33b9ea9f 18.0 landed
-
localbuf: Introduce TerminateLocalBufferIO()
- dd6f2618f681 18.0 landed
-
localbuf: Fix dangerous coding pattern in GetLocalVictimBuffer()
- fa6af9b25e4b 18.0 landed
-
localbuf: Introduce StartLocalBufferIO()
- 771ba90298e2 18.0 landed
-
localbuf: Introduce InvalidateLocalBuffer()
- 0762a151b0e0 18.0 landed
-
Allow lwlocks to be disowned
- f8d7f29b3e81 18.0 landed
-
Make jsonb casts to scalar types translate JSON null to SQL NULL.
- a5579a90af05 18.0 cited
-
bufmgr/smgr: Don't cross segment boundaries in StartReadBuffers()
- 755a4c10d19d 18.0 landed
-
Use aux process resource owner in walsender
- 57f370247127 18.0 landed
-
bufmgr: Return early in ScheduleBufferTagForWriteback() if fsync=off
- 488f826c729b 18.0 landed
Hi, On 2025-03-24 11:43:47 -0400, Andres Freund wrote: > > I didn't write a test to prove it, but I'm suspecting we'll reach the above > > ERROR with this sequence: > > > > CREATE TEMP TABLE foo ...; > > [some command that starts reading a block of foo into local buffers, then ERROR with IO ongoing] > > DROP TABLE foo; > > That seems plausible. I'll try to write a test after this email. FWIW, a test did indeed confirm that. Luckily: > > DropRelationAllLocalBuffers() calls InvalidateLocalBuffer(bufHdr, true). I > > think we'd need to do like pgaio_shutdown() and finish all IOs (or all IOs for > > the particular rel) before InvalidateLocalBuffer(). Or use something like the > > logic near elog(ERROR, "buffer is pinned in InvalidateBuffer") in > > corresponding bufmgr code. > > Just waiting for the IO in InvalidateBuffer() does seem like the best bet to > me. This did indeed resolve the issue. I've extended the testsuite to test for that and a bunch more things. Working on sending out a new version... > > We call read_stream_get_block() while in batchmode, so the stream callback > > needs to be ready for that. A complicated case is > > collect_corrupt_items_read_stream_next_block(), which may do its own buffer > > I/O to read in a vmbuffer for VM_ALL_FROZEN(). That's feeling to me like a > > recipe for corner cases reaching ERROR "starting batch while batch already in > > progress". Are there mitigating factors? > > Ugh, yes, you're right. heap_vac_scan_next_block() is also affected. > > I don't think "starting batch while batch already in progress" is the real > issue though - it seems easy enough to avoid starting another batch inside, > partially because current cases seem unlikely to need to do batchable IO > inside. What worries me more is that code might block while there's > unsubmitted IO - which seems entirely plausible. > > > I can see a few approaches: > > 1) Declare that all read stream callbacks have to be careful and cope with > batch mode > > I'm not sure how viable that is, not starting batches seems ok, but > ensuring that the code doesn't block is a different story. > > > 2) Have read stream users opt-in to batching > > Presumably via a flag like READ_STREAM_USE_BATCHING. That'd be easy enough > to implement and to add to the callsites where that's fine. > > > 3) Teach read stream to "look ahead" far enough to determine all the blocks > that could be issued in a batch outside of batchmode > > I think that's probably not a great idea, it'd lead us to looking further > ahead than we really need to, which could increase "unfairness" in > e.g. parallel sequential scan. > > > 4) Just defer using batch mode for now > > It's a nice win with io_uring for random IO, e.g. from bitmap heap scans , > but there's no need to immediately solve this. > > > I think regardless of what we go for, it's worth splitting > "aio: Basic read_stream adjustments for real AIO" > into the actually basic parts (i.e. introducing sync_mode) from the not > actually so basic parts (i.e. batching). > > > I suspect that 2) would be the best approach. Only the read stream user knows > what it needs to do in the callback. I still think 2) would be the best option. Writing a patch for that. If a callback may sometimes need to block, it can still opt into READ_STREAM_USE_BATCHING, by submitting all staged IO before blocking. The hardest part is to explain the flag. Here's my current attempt: /* --- * Opt-in to using AIO batchmode. * * Submitting IO in larger batches can be more efficient than doing so * one-by-one, particularly for many small reads. It does, however, require * the ReadStreamBlockNumberCB callback to abide by the restrictions of AIO * batching (c.f. pgaio_enter_batchmode()). Basically, the callback may not: * a) block without first calling pgaio_submit_staged(), unless a * to-be-waited-on lock cannot be part of a deadlock, e.g. because it is * never acquired in a nested fashion * b) directly or indirectly start another batch pgaio_enter_batchmode() * * As this requires care and is nontrivial in some cases, batching is only * used with explicit opt-in. * --- */ #define READ_STREAM_USE_BATCHING 0x08 Greetings, Andres Freund