mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Add block_range_read_stream_cb(), to deduplicate code.
This replaces two functions for iterating over all blocks in a range. A pending patch will use this instead of adding a third. Nazir Bilal Yavuz Discussion: https://postgr.es/m/20240820184742.f2.nmisch@google.com
This commit is contained in:
@ -39,25 +39,6 @@ typedef enum
|
|||||||
|
|
||||||
static PGIOAlignedBlock blockbuffer;
|
static PGIOAlignedBlock blockbuffer;
|
||||||
|
|
||||||
struct pg_prewarm_read_stream_private
|
|
||||||
{
|
|
||||||
BlockNumber blocknum;
|
|
||||||
int64 last_block;
|
|
||||||
};
|
|
||||||
|
|
||||||
static BlockNumber
|
|
||||||
pg_prewarm_read_stream_next_block(ReadStream *stream,
|
|
||||||
void *callback_private_data,
|
|
||||||
void *per_buffer_data)
|
|
||||||
{
|
|
||||||
struct pg_prewarm_read_stream_private *p = callback_private_data;
|
|
||||||
|
|
||||||
if (p->blocknum <= p->last_block)
|
|
||||||
return p->blocknum++;
|
|
||||||
|
|
||||||
return InvalidBlockNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pg_prewarm(regclass, mode text, fork text,
|
* pg_prewarm(regclass, mode text, fork text,
|
||||||
* first_block int8, last_block int8)
|
* first_block int8, last_block int8)
|
||||||
@ -203,7 +184,7 @@ pg_prewarm(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
else if (ptype == PREWARM_BUFFER)
|
else if (ptype == PREWARM_BUFFER)
|
||||||
{
|
{
|
||||||
struct pg_prewarm_read_stream_private p;
|
BlockRangeReadStreamPrivate p;
|
||||||
ReadStream *stream;
|
ReadStream *stream;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -211,14 +192,14 @@ pg_prewarm(PG_FUNCTION_ARGS)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Set up the private state for our streaming buffer read callback. */
|
/* Set up the private state for our streaming buffer read callback. */
|
||||||
p.blocknum = first_block;
|
p.current_blocknum = first_block;
|
||||||
p.last_block = last_block;
|
p.last_exclusive = last_block + 1;
|
||||||
|
|
||||||
stream = read_stream_begin_relation(READ_STREAM_FULL,
|
stream = read_stream_begin_relation(READ_STREAM_FULL,
|
||||||
NULL,
|
NULL,
|
||||||
rel,
|
rel,
|
||||||
forkNumber,
|
forkNumber,
|
||||||
pg_prewarm_read_stream_next_block,
|
block_range_read_stream_cb,
|
||||||
&p,
|
&p,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
@ -163,6 +163,23 @@ get_per_buffer_data(ReadStream *stream, int16 buffer_index)
|
|||||||
stream->per_buffer_data_size * buffer_index;
|
stream->per_buffer_data_size * buffer_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* General-use ReadStreamBlockNumberCB for block range scans. Loops over the
|
||||||
|
* blocks [current_blocknum, last_exclusive).
|
||||||
|
*/
|
||||||
|
BlockNumber
|
||||||
|
block_range_read_stream_cb(ReadStream *stream,
|
||||||
|
void *callback_private_data,
|
||||||
|
void *per_buffer_data)
|
||||||
|
{
|
||||||
|
BlockRangeReadStreamPrivate *p = callback_private_data;
|
||||||
|
|
||||||
|
if (p->current_blocknum < p->last_exclusive)
|
||||||
|
return p->current_blocknum++;
|
||||||
|
|
||||||
|
return InvalidBlockNumber;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ask the callback which block it would like us to read next, with a one block
|
* Ask the callback which block it would like us to read next, with a one block
|
||||||
* buffer in front to allow read_stream_unget_block() to work.
|
* buffer in front to allow read_stream_unget_block() to work.
|
||||||
|
@ -136,33 +136,6 @@ typedef struct SMgrSortArray
|
|||||||
SMgrRelation srel;
|
SMgrRelation srel;
|
||||||
} SMgrSortArray;
|
} SMgrSortArray;
|
||||||
|
|
||||||
/*
|
|
||||||
* Helper struct for read stream object used in
|
|
||||||
* RelationCopyStorageUsingBuffer() function.
|
|
||||||
*/
|
|
||||||
struct copy_storage_using_buffer_read_stream_private
|
|
||||||
{
|
|
||||||
BlockNumber blocknum;
|
|
||||||
BlockNumber nblocks;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Callback function to get next block for read stream object used in
|
|
||||||
* RelationCopyStorageUsingBuffer() function.
|
|
||||||
*/
|
|
||||||
static BlockNumber
|
|
||||||
copy_storage_using_buffer_read_stream_next_block(ReadStream *stream,
|
|
||||||
void *callback_private_data,
|
|
||||||
void *per_buffer_data)
|
|
||||||
{
|
|
||||||
struct copy_storage_using_buffer_read_stream_private *p = callback_private_data;
|
|
||||||
|
|
||||||
if (p->blocknum < p->nblocks)
|
|
||||||
return p->blocknum++;
|
|
||||||
|
|
||||||
return InvalidBlockNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GUC variables */
|
/* GUC variables */
|
||||||
bool zero_damaged_pages = false;
|
bool zero_damaged_pages = false;
|
||||||
int bgwriter_lru_maxpages = 100;
|
int bgwriter_lru_maxpages = 100;
|
||||||
@ -4710,7 +4683,7 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator,
|
|||||||
PGIOAlignedBlock buf;
|
PGIOAlignedBlock buf;
|
||||||
BufferAccessStrategy bstrategy_src;
|
BufferAccessStrategy bstrategy_src;
|
||||||
BufferAccessStrategy bstrategy_dst;
|
BufferAccessStrategy bstrategy_dst;
|
||||||
struct copy_storage_using_buffer_read_stream_private p;
|
BlockRangeReadStreamPrivate p;
|
||||||
ReadStream *src_stream;
|
ReadStream *src_stream;
|
||||||
SMgrRelation src_smgr;
|
SMgrRelation src_smgr;
|
||||||
|
|
||||||
@ -4742,15 +4715,15 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator,
|
|||||||
bstrategy_dst = GetAccessStrategy(BAS_BULKWRITE);
|
bstrategy_dst = GetAccessStrategy(BAS_BULKWRITE);
|
||||||
|
|
||||||
/* Initialize streaming read */
|
/* Initialize streaming read */
|
||||||
p.blocknum = 0;
|
p.current_blocknum = 0;
|
||||||
p.nblocks = nblocks;
|
p.last_exclusive = nblocks;
|
||||||
src_smgr = smgropen(srclocator, INVALID_PROC_NUMBER);
|
src_smgr = smgropen(srclocator, INVALID_PROC_NUMBER);
|
||||||
src_stream = read_stream_begin_smgr_relation(READ_STREAM_FULL,
|
src_stream = read_stream_begin_smgr_relation(READ_STREAM_FULL,
|
||||||
bstrategy_src,
|
bstrategy_src,
|
||||||
src_smgr,
|
src_smgr,
|
||||||
permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED,
|
permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED,
|
||||||
forkNum,
|
forkNum,
|
||||||
copy_storage_using_buffer_read_stream_next_block,
|
block_range_read_stream_cb,
|
||||||
&p,
|
&p,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
@ -45,11 +45,21 @@
|
|||||||
struct ReadStream;
|
struct ReadStream;
|
||||||
typedef struct ReadStream ReadStream;
|
typedef struct ReadStream ReadStream;
|
||||||
|
|
||||||
|
/* for block_range_read_stream_cb */
|
||||||
|
typedef struct BlockRangeReadStreamPrivate
|
||||||
|
{
|
||||||
|
BlockNumber current_blocknum;
|
||||||
|
BlockNumber last_exclusive;
|
||||||
|
} BlockRangeReadStreamPrivate;
|
||||||
|
|
||||||
/* Callback that returns the next block number to read. */
|
/* Callback that returns the next block number to read. */
|
||||||
typedef BlockNumber (*ReadStreamBlockNumberCB) (ReadStream *stream,
|
typedef BlockNumber (*ReadStreamBlockNumberCB) (ReadStream *stream,
|
||||||
void *callback_private_data,
|
void *callback_private_data,
|
||||||
void *per_buffer_data);
|
void *per_buffer_data);
|
||||||
|
|
||||||
|
extern BlockNumber block_range_read_stream_cb(ReadStream *stream,
|
||||||
|
void *callback_private_data,
|
||||||
|
void *per_buffer_data);
|
||||||
extern ReadStream *read_stream_begin_relation(int flags,
|
extern ReadStream *read_stream_begin_relation(int flags,
|
||||||
BufferAccessStrategy strategy,
|
BufferAccessStrategy strategy,
|
||||||
Relation rel,
|
Relation rel,
|
||||||
|
@ -275,6 +275,7 @@ BlockId
|
|||||||
BlockIdData
|
BlockIdData
|
||||||
BlockInfoRecord
|
BlockInfoRecord
|
||||||
BlockNumber
|
BlockNumber
|
||||||
|
BlockRangeReadStreamPrivate
|
||||||
BlockRefTable
|
BlockRefTable
|
||||||
BlockRefTableBuffer
|
BlockRefTableBuffer
|
||||||
BlockRefTableChunk
|
BlockRefTableChunk
|
||||||
|
Reference in New Issue
Block a user