Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3a352df

Browse filesBrowse files
committed
Use streaming I/O in pg_prewarm.
Instead of calling ReadBuffer() repeatedly, use the new streaming interface. This commit provides a very simple example of such a transformation. Discussion: https://postgr.es/m/CA+hUKGJkOiOCa+mag4BF+zHo7qo=o9CFheB8=g6uT5TUm2gkvA@mail.gmail.com
1 parent b5a9b18 commit 3a352df
Copy full SHA for 3a352df

File tree

Expand file treeCollapse file tree

1 file changed

+39
-1
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+39
-1
lines changed

‎contrib/pg_prewarm/pg_prewarm.c

Copy file name to clipboardExpand all lines: contrib/pg_prewarm/pg_prewarm.c
+39-1Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "fmgr.h"
2020
#include "miscadmin.h"
2121
#include "storage/bufmgr.h"
22+
#include "storage/read_stream.h"
2223
#include "storage/smgr.h"
2324
#include "utils/acl.h"
2425
#include "utils/builtins.h"
@@ -38,6 +39,25 @@ typedef enum
3839

3940
static PGIOAlignedBlock blockbuffer;
4041

42+
struct pg_prewarm_read_stream_private
43+
{
44+
BlockNumber blocknum;
45+
int64 last_block;
46+
};
47+
48+
static BlockNumber
49+
pg_prewarm_read_stream_next_block(ReadStream *stream,
50+
void *callback_private_data,
51+
void *per_buffer_data)
52+
{
53+
struct pg_prewarm_read_stream_private *p = callback_private_data;
54+
55+
if (p->blocknum <= p->last_block)
56+
return p->blocknum++;
57+
58+
return InvalidBlockNumber;
59+
}
60+
4161
/*
4262
* pg_prewarm(regclass, mode text, fork text,
4363
* first_block int8, last_block int8)
@@ -183,18 +203,36 @@ pg_prewarm(PG_FUNCTION_ARGS)
183203
}
184204
else if (ptype == PREWARM_BUFFER)
185205
{
206+
struct pg_prewarm_read_stream_private p;
207+
ReadStream *stream;
208+
186209
/*
187210
* In buffer mode, we actually pull the data into shared_buffers.
188211
*/
212+
213+
/* Set up the private state for our streaming buffer read callback. */
214+
p.blocknum = first_block;
215+
p.last_block = last_block;
216+
217+
stream = read_stream_begin_relation(READ_STREAM_FULL,
218+
NULL,
219+
rel,
220+
forkNumber,
221+
pg_prewarm_read_stream_next_block,
222+
&p,
223+
0);
224+
189225
for (block = first_block; block <= last_block; ++block)
190226
{
191227
Buffer buf;
192228

193229
CHECK_FOR_INTERRUPTS();
194-
buf = ReadBufferExtended(rel, forkNumber, block, RBM_NORMAL, NULL);
230+
buf = read_stream_next_buffer(stream, NULL);
195231
ReleaseBuffer(buf);
196232
++blocks_done;
197233
}
234+
Assert(read_stream_next_buffer(stream, NULL) == InvalidBuffer);
235+
read_stream_end(stream);
198236
}
199237

200238
/* Close relation, release lock. */

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.