Skip to content

Commit 70d38e3

Browse files
committed
Allow ReadStream to be consumed as raw block numbers.
Commits 041b968 and 6377e12 changed the interface of scan_analyze_next_block() to take a ReadStream instead of a BlockNumber and a BufferAccessStrategy, and to return a value to indicate when the stream has run out of blocks. This caused integration problems for at least one known extension that uses specially encoded BlockNumber values that map to different underlying storage, because acquire_sample_rows() sets up the stream so that read_stream_next_buffer() reads blocks from the main fork of the relation's SMgrRelation. Provide read_stream_next_block(), as a way for such an extension to access the stream of raw BlockNumbers directly and forward them to its own ReadBuffer() calls after decoding, as it could in earlier releases. The new function returns the BlockNumber and BufferAccessStrategy that were previously passed directly to scan_analyze_next_block(). Alternatively, an extension could wrap the stream of BlockNumbers in another ReadStream with a callback that performs any decoding required to arrive at real storage manager BlockNumber values, so that it could benefit from the I/O combining and concurrency provided by read_stream.c. Another class of table access method that does nothing in scan_analyze_next_block() because it is not block-oriented could use this function to control the number of block sampling loops. It could match the previous behavior with "return read_stream_next_block(stream, &bas) != InvalidBlockNumber". Ongoing work is expected to provide better ANALYZE support for table access methods that don't behave like heapam with respect to storage blocks, but that will be for future releases. Back-patch to 17. Reported-by: Mats Kindahl <mats@timescale.com> Reviewed-by: Mats Kindahl <mats@timescale.com> Discussion: https://postgr.es/m/CA%2B14425%2BCcm07ocG97Fp%2BFrD9xUXqmBKFvecp0p%2BgV2YYR258Q%40mail.gmail.com
1 parent 918e21d commit 70d38e3

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

src/backend/storage/aio/read_stream.c

+14
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,20 @@ read_stream_next_buffer(ReadStream *stream, void **per_buffer_data)
797797
return buffer;
798798
}
799799

800+
/*
801+
* Transitional support for code that would like to perform or skip reads
802+
* itself, without using the stream. Returns, and consumes, the next block
803+
* number that would be read by the stream's look-ahead algorithm, or
804+
* InvalidBlockNumber if the end of the stream is reached. Also reports the
805+
* strategy that would be used to read it.
806+
*/
807+
BlockNumber
808+
read_stream_next_block(ReadStream *stream, BufferAccessStrategy *strategy)
809+
{
810+
*strategy = stream->ios[0].op.strategy;
811+
return read_stream_get_block(stream, NULL);
812+
}
813+
800814
/*
801815
* Reset a read stream by releasing any queued up buffers, allowing the stream
802816
* to be used again for different blocks. This can be used to clear an

src/include/storage/read_stream.h

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ extern ReadStream *read_stream_begin_relation(int flags,
6868
void *callback_private_data,
6969
size_t per_buffer_data_size);
7070
extern Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_data);
71+
extern BlockNumber read_stream_next_block(ReadStream *stream,
72+
BufferAccessStrategy *strategy);
7173
extern ReadStream *read_stream_begin_smgr_relation(int flags,
7274
BufferAccessStrategy strategy,
7375
SMgrRelation smgr,

0 commit comments

Comments
 (0)