Add a way to create read stream object by using SMgrRelation.
authorNoah Misch <[email protected]>
Sat, 20 Jul 2024 11:22:12 +0000 (04:22 -0700)
committerNoah Misch <[email protected]>
Sat, 20 Jul 2024 11:22:12 +0000 (04:22 -0700)
Currently read stream object can be created only by using Relation.

Nazir Bilal Yavuz

Discussion: https://postgr.es/m/CAN55FZ0JKL6vk1xQp6rfOXiNFV1u1H0tJDPPGHWoiO3ea2Wc=A@mail.gmail.com

src/backend/storage/aio/read_stream.c
src/include/storage/read_stream.h

index 58221649f270c3370cf68519984c6a639324183b..684b6d6fc0c9f990b1f4cca49fec7925f175c1a1 100644 (file)
@@ -406,14 +406,16 @@ read_stream_look_ahead(ReadStream *stream, bool suppress_advice)
  * write extra data for each block into the space provided to it.  It will
  * also receive callback_private_data for its own purposes.
  */
-ReadStream *
-read_stream_begin_relation(int flags,
-                          BufferAccessStrategy strategy,
-                          Relation rel,
-                          ForkNumber forknum,
-                          ReadStreamBlockNumberCB callback,
-                          void *callback_private_data,
-                          size_t per_buffer_data_size)
+static ReadStream *
+read_stream_begin_impl(int flags,
+                      BufferAccessStrategy strategy,
+                      Relation rel,
+                      SMgrRelation smgr,
+                      char persistence,
+                      ForkNumber forknum,
+                      ReadStreamBlockNumberCB callback,
+                      void *callback_private_data,
+                      size_t per_buffer_data_size)
 {
    ReadStream *stream;
    size_t      size;
@@ -422,9 +424,6 @@ read_stream_begin_relation(int flags,
    int         strategy_pin_limit;
    uint32      max_pinned_buffers;
    Oid         tablespace_id;
-   SMgrRelation smgr;
-
-   smgr = RelationGetSmgr(rel);
 
    /*
     * Decide how many I/Os we will allow to run at the same time.  That
@@ -434,7 +433,7 @@ read_stream_begin_relation(int flags,
     */
    tablespace_id = smgr->smgr_rlocator.locator.spcOid;
    if (!OidIsValid(MyDatabaseId) ||
-       IsCatalogRelation(rel) ||
+       (rel && IsCatalogRelation(rel)) ||
        IsCatalogRelationOid(smgr->smgr_rlocator.locator.relNumber))
    {
        /*
@@ -550,8 +549,8 @@ read_stream_begin_relation(int flags,
    for (int i = 0; i < max_ios; ++i)
    {
        stream->ios[i].op.rel = rel;
-       stream->ios[i].op.smgr = RelationGetSmgr(rel);
-       stream->ios[i].op.persistence = rel->rd_rel->relpersistence;
+       stream->ios[i].op.smgr = smgr;
+       stream->ios[i].op.persistence = persistence;
        stream->ios[i].op.forknum = forknum;
        stream->ios[i].op.strategy = strategy;
    }
@@ -559,6 +558,55 @@ read_stream_begin_relation(int flags,
    return stream;
 }
 
+/*
+ * Create a new read stream for reading a relation.
+ * See read_stream_begin_impl() for the detailed explanation.
+ */
+ReadStream *
+read_stream_begin_relation(int flags,
+                          BufferAccessStrategy strategy,
+                          Relation rel,
+                          ForkNumber forknum,
+                          ReadStreamBlockNumberCB callback,
+                          void *callback_private_data,
+                          size_t per_buffer_data_size)
+{
+   return read_stream_begin_impl(flags,
+                                 strategy,
+                                 rel,
+                                 RelationGetSmgr(rel),
+                                 rel->rd_rel->relpersistence,
+                                 forknum,
+                                 callback,
+                                 callback_private_data,
+                                 per_buffer_data_size);
+}
+
+/*
+ * Create a new read stream for reading a SMgr relation.
+ * See read_stream_begin_impl() for the detailed explanation.
+ */
+ReadStream *
+read_stream_begin_smgr_relation(int flags,
+                               BufferAccessStrategy strategy,
+                               SMgrRelation smgr,
+                               char smgr_persistence,
+                               ForkNumber forknum,
+                               ReadStreamBlockNumberCB callback,
+                               void *callback_private_data,
+                               size_t per_buffer_data_size)
+{
+   return read_stream_begin_impl(flags,
+                                 strategy,
+                                 NULL,
+                                 smgr,
+                                 smgr_persistence,
+                                 forknum,
+                                 callback,
+                                 callback_private_data,
+                                 per_buffer_data_size);
+}
+
 /*
  * Pull one pinned buffer out of a stream.  Each call returns successive
  * blocks in the order specified by the callback.  If per_buffer_data_size was
index f676d2cc20a7dc9678f3012903bbd90f3acce484..4e599904f26a99bf27ad94cdc0c6351d372a881d 100644 (file)
@@ -15,6 +15,7 @@
 #define READ_STREAM_H
 
 #include "storage/bufmgr.h"
+#include "storage/smgr.h"
 
 /* Default tuning, reasonable for many users. */
 #define READ_STREAM_DEFAULT 0x00
@@ -57,6 +58,15 @@ extern ReadStream *read_stream_begin_relation(int flags,
                                              void *callback_private_data,
                                              size_t per_buffer_data_size);
 extern Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_data);
+extern ReadStream *read_stream_begin_smgr_relation(int flags,
+                                                  BufferAccessStrategy strategy,
+                                                  SMgrRelation smgr,
+                                                  char smgr_persistence,
+                                                  ForkNumber forknum,
+                                                  ReadStreamBlockNumberCB callback,
+                                                  void *callback_private_data,
+                                                  size_t per_buffer_data_size);
+extern Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_private);
 extern void read_stream_reset(ReadStream *stream);
 extern void read_stream_end(ReadStream *stream);