diff options
author | Andres Freund | 2025-03-30 22:30:36 +0000 |
---|---|---|
committer | Andres Freund | 2025-03-30 22:36:41 +0000 |
commit | ae3df4b34155d4a3811762e78d5076e64df66fba (patch) | |
tree | b31b50ce1fda873657aaa8e08b3ff17075fbb1da /src/include/storage | |
parent | f4d0730bbca1b338b8f06389d04816c6c9f06e58 (diff) |
read_stream: Introduce and use optional batchmode support
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 held while waiting for IO.
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.
This patch adds an explicit flag (READ_STREAM_USE_BATCHING) to read_stream and
uses it where appropriate.
There are two cases where batching would likely be beneficial, but where we
aren't using it yet:
1) bitmap heap scans, because the callback reads the VM
This should soon be solved, because we are planning to remove the use of
the VM, due to that not being sound.
2) The first phase of heap vacuum
This could be made to support batchmode, but would require some care.
Reviewed-by: Noah Misch <[email protected]>
Reviewed-by: Thomas Munro <[email protected]>
Discussion: https://postgr.es/m/uvrtrknj4kdytuboidbhwclo4gxhswwcpgadptsjvjqcluzmah%40brqs62irg4dt
Diffstat (limited to 'src/include/storage')
-rw-r--r-- | src/include/storage/read_stream.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/include/storage/read_stream.h b/src/include/storage/read_stream.h index c11d8ce3300..9b0d65161d0 100644 --- a/src/include/storage/read_stream.h +++ b/src/include/storage/read_stream.h @@ -42,6 +42,27 @@ */ #define READ_STREAM_FULL 0x04 +/* --- + * 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 held while waiting for IO. + * + * b) start another batch (without first exiting batchmode and re-entering + * before returning) + * + * As this requires care and is nontrivial in some cases, batching is only + * used with explicit opt-in. + * --- + */ +#define READ_STREAM_USE_BATCHING 0x08 + struct ReadStream; typedef struct ReadStream ReadStream; |