summaryrefslogtreecommitdiff
path: root/src/backend/storage/aio/read_stream.c
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2024-04-06 22:58:48 +1300
committerThomas Munro <tmunro@postgresql.org>2024-04-06 23:11:45 +1300
commit3bd8439ed628c7e9ac250b1a042d9044303c37e7 (patch)
tree5c873d096cc74591d1d1d21598af69c66918353c /src/backend/storage/aio/read_stream.c
parentf956ecd0353b2960f8322b2211142113fe2b6f67 (diff)
Allow BufferAccessStrategy to limit pin count.
While pinning extra buffers to look ahead, users of strategies are in danger of using too many buffers. For some strategies, that means "escaping" from the ring, and in others it means forcing dirty data to disk very frequently with associated WAL flushing. Since external code has no insight into any of that, allow individual strategy types to expose a clamp that should be applied when deciding how many buffers to pin at once. Reviewed-by: Andres Freund <andres@anarazel.de> Reviewed-by: Melanie Plageman <melanieplageman@gmail.com> Discussion: https://postgr.es/m/CAAKRu_aJXnqsyZt6HwFLnxYEBgE17oypkxbKbT1t1geE_wvH2Q%40mail.gmail.com
Diffstat (limited to 'src/backend/storage/aio/read_stream.c')
-rw-r--r--src/backend/storage/aio/read_stream.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/backend/storage/aio/read_stream.c b/src/backend/storage/aio/read_stream.c
index b9e11a28312..9a70a81f7ae 100644
--- a/src/backend/storage/aio/read_stream.c
+++ b/src/backend/storage/aio/read_stream.c
@@ -419,6 +419,7 @@ read_stream_begin_relation(int flags,
size_t size;
int16 queue_size;
int16 max_ios;
+ int strategy_pin_limit;
uint32 max_pinned_buffers;
Oid tablespace_id;
SMgrRelation smgr;
@@ -460,6 +461,10 @@ read_stream_begin_relation(int flags,
max_pinned_buffers = Min(max_pinned_buffers,
PG_INT16_MAX - io_combine_limit - 1);
+ /* Give the strategy a chance to limit the number of buffers we pin. */
+ strategy_pin_limit = GetAccessStrategyPinLimit(strategy);
+ max_pinned_buffers = Min(strategy_pin_limit, max_pinned_buffers);
+
/* Don't allow this backend to pin more than its share of buffers. */
if (SmgrIsTemp(smgr))
LimitAdditionalLocalPins(&max_pinned_buffers);