v2-0007-bufmgr-Move-relation-extension-handling-into-Bulk.patch

+static BlockNumber
+BulkExtendSharedRelationBuffered(Relation rel,
+                                                                SMgrRelation 
smgr,
+                                                                bool 
skip_extension_lock,
+                                                                char 
relpersistence,
+                                                                ForkNumber 
fork, ReadBufferMode mode,
+                                                                
BufferAccessStrategy strategy,
+                                                                uint32 
*num_pages,
+                                                                uint32 
num_locked_pages,
+                                                                Buffer 
*buffers)

Ugh, that's a lot of arguments, some are inputs and some are outputs. I don't have any concrete suggestions, but could we simplify this somehow? Needs a comment at least.

v2-0008-Convert-a-few-places-to-ExtendRelationBuffered.patch

diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index de1427a1e0e..1810f7ebfef 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -829,9 +829,11 @@ brinbuild(Relation heap, Relation index, IndexInfo 
*indexInfo)
         * whole relation will be rolled back.
         */
- meta = ReadBuffer(index, P_NEW);
+       meta = ExtendRelationBuffered(index, NULL, true,
+                                                                 
index->rd_rel->relpersistence,
+                                                                 MAIN_FORKNUM, 
RBM_ZERO_AND_LOCK,
+                                                                 NULL);
        Assert(BufferGetBlockNumber(meta) == BRIN_METAPAGE_BLKNO);
-       LockBuffer(meta, BUFFER_LOCK_EXCLUSIVE);
brin_metapage_init(BufferGetPage(meta), BrinGetPagesPerRange(index),
                                           BRIN_CURRENT_VERSION);

Since we're changing the API anyway, how about introducing a new function for this case where we extend the relation but we what block number we're going to get? This pattern of using P_NEW and asserting the result has always felt awkward to me.

-               buf = ReadBuffer(irel, P_NEW);
+               buf = ExtendRelationBuffered(irel, NULL, false,
+                                                                        
irel->rd_rel->relpersistence,
+                                                                        
MAIN_FORKNUM, RBM_ZERO_AND_LOCK,
+                                                                        NULL);

These new calls are pretty verbose, compared to ReadBuffer(rel, P_NEW). I'd suggest something like:

buf = ExtendBuffer(rel);

Do other ReadBufferModes than RBM_ZERO_AND_LOCK make sense with ExtendRelationBuffered?

Is it ever possible to call this without a relcache entry? WAL redo functions do that with ReadBuffer, but they only extend a relation implicitly, by replay a record for a particular block.

All of the above comments are around the BulkExtendRelationBuffered() function's API. That needs a closer look and a more thought-out design to make it nice. Aside from that, this approach seems valid.

- Heikki



Reply via email to