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-04-05 06:43:52 -0700, Noah Misch wrote: > Yeah. Maybe this (untested): Something like that works. I adopted your formulation of this, mine was in GetLocalVictimBuffer(), which seems slightly less future proof. > > > If that's right, it would still be nice to reach the right > > > VALGRIND_MAKE_MEM_DEFINED() without involving bufmgr. > > > > I think that would be possible if we didn't do VALGRIND_MAKE_MEM_NOACCESS() in > > UnpinBuffer()/UnpinLocalBuffer(). But with that I don't see how we can avoid > > needing to remark the region as accessible? > > Yes, it's not that we should remove VALGRIND_MAKE_MEM_DEFINED() from bufmgr. > I was trying to think about future AIO callers (e.g. RelationCopyStorage()) > and how they'd want things to work. Ah, I now understand what you mean. I'm inclined to leave that out for now, we can do that later. I spent a bit of time experimenting with going bigger, but I think it's important to get skink a bit less red. > That said, perhaps we should just omit the io_uring-level Valgrind calls and > delegate the problem to higher layers until there's a concrete use case: Yes, I think that's the right answer for now. Applied your suggested comment. I looked for a good place to add a comment to method_io_uring.c, but couldn't really come up with anything convincing. Then I thought the * "Start" routines for individual IO operations comment in aio_io.c might be a good place, but also failed to come up with anything particularly convincing. > > > - A complete_local callback solves those problems. However, if the > > > AIO-defining subxact aborted, then we shouldn't set DEFINED at all, since > > > the buffer mapping may have changed by the time of complete_local. > > > > I don't think that is possible, due to the aio subsystem owned pin? > > We currently drop the shared buffer AIO subsystem pin in complete_shared > (buffer_readv_complete_one() -> TerminateBufferIO()). I was trying to say > that if we put a VALGRIND_MAKE_MEM_DEFINED in complete_local without changing > anything else, it would have this problem. Ah, yes, I see what you mean. > We probably wouldn't want to move the shared buffer pin drop to > complete_local without a strong reason. Agreed. > > I think the point about non-aio uses is a fair one, but I don't quite know how > > to best solve it right now, due to the local buffer issue you mentioned. I'd > > guess that we'd best put it somewhere > > a) in pgaio_io_process_completion(), if definer==completor || !PGAIO_HF_REFERENCES_LOCAL > > b) pgaio_io_call_complete_local(), just before calling > > pgaio_io_call_complete_local() if PGAIO_HF_REFERENCES_LOCAL > > I think that would do nothing wrong today, but it uses > !PGAIO_HF_REFERENCES_LOCAL as a proxy for "target memory is already DEFINED, > or a higher layer will make it DEFINED". While !PGAIO_HF_REFERENCES_LOCAL > does imply that today, I think that's a bufmgr-specific conclusion. I have no > particular reason to expect that to hold for future AIO use cases. As above, > I'd be inclined to omit the io_uring-level Valgrind calls until we have a > concrete use case to drive their design. How do you see it? Yea, I'm not sure either. I think we'll best wait until we have non-bufmgr AIO to address all this. That'll make it easier to shake out. I think eventually we should do an explicit - VALGRIND_CHECK_MEM_IS_ADDRESSABLE() in pgaio_io_start_readv - VALGRIND_CHECK_MEM_IS_DEFINED() in pgaio_io_start_writev - VALGRIND_MAKE_MEM_DEFINED() in when a READV completes, although some of the details of when/where to do that aren't entirely clear to me yet. I suspect we might have to do it in pgaio_io_start_readv(), because it's harder to reliably do it later I've pushed the patches. Thanks for the discussion, somehow the mix of shared memory with valgrind tracking accessibility/definedness in a process local manner is somewhat mindbending. Greetings, Andres Freund