Skip to content

Commit e522e2d

Browse files
committed
c
1 parent 49f9413 commit e522e2d

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

contrib/pg_prewarm/pg_prewarm.c

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ typedef enum
3636
{
3737
PREWARM_PREFETCH,
3838
PREWARM_READ,
39-
PREWARM_BUFFER
39+
PREWARM_BUFFER,
40+
PREWARM_TUPLE,
4041
} PrewarmType;
4142

4243
static PGIOAlignedBlock blockbuffer;
@@ -89,6 +90,8 @@ pg_prewarm(PG_FUNCTION_ARGS)
8990
ptype = PREWARM_READ;
9091
else if (strcmp(ttype, "buffer") == 0)
9192
ptype = PREWARM_BUFFER;
93+
else if (strcmp(ttype, "tuple") == 0)
94+
ptype = PREWARM_TUPLE;
9295
else
9396
{
9497
ereport(ERROR,
@@ -185,6 +188,33 @@ pg_prewarm(PG_FUNCTION_ARGS)
185188
}
186189
}
187190
else if (ptype == PREWARM_BUFFER)
191+
{
192+
BlockNumber prefetch_block = first_block;
193+
Oid nspOid;
194+
int io_concurrency;
195+
196+
nspOid = rel->rd_rel->reltablespace;
197+
io_concurrency = get_tablespace_maintenance_io_concurrency(nspOid);
198+
199+
/*
200+
* In buffer mode, we actually pull the data into shared_buffers.
201+
*/
202+
for (block = first_block; block <= last_block; ++block)
203+
{
204+
Buffer buf;
205+
BlockNumber prefetch_stop = block + Min(last_block - block + 1,
206+
io_concurrency);
207+
CHECK_FOR_INTERRUPTS();
208+
while (prefetch_block < prefetch_stop)
209+
{
210+
PrefetchBuffer(rel, forkNumber, prefetch_block++);
211+
}
212+
buf = ReadBufferExtended(rel, forkNumber, block, RBM_NORMAL, NULL);
213+
ReleaseBuffer(buf);
214+
++blocks_done;
215+
}
216+
}
217+
else if (ptype == PREWARM_TUPLE)
188218
{
189219
if (get_relkind_objtype(rel->rd_rel->relkind) == OBJECT_TABLE && forkNumber == MAIN_FORKNUM)
190220
{
@@ -204,33 +234,11 @@ pg_prewarm(PG_FUNCTION_ARGS)
204234
CHECK_FOR_INTERRUPTS();
205235
}
206236
heap_endscan(scan);
207-
}
208-
else
237+
} else
209238
{
210-
BlockNumber prefetch_block = first_block;
211-
Oid nspOid;
212-
int io_concurrency;
213-
214-
nspOid = rel->rd_rel->reltablespace;
215-
io_concurrency = get_tablespace_maintenance_io_concurrency(nspOid);
216-
217-
/*
218-
* In buffer mode, we actually pull the data into shared_buffers.
219-
*/
220-
for (block = first_block; block <= last_block; ++block)
221-
{
222-
Buffer buf;
223-
BlockNumber prefetch_stop = block + Min(last_block - block + 1,
224-
io_concurrency);
225-
CHECK_FOR_INTERRUPTS();
226-
while (prefetch_block < prefetch_stop)
227-
{
228-
PrefetchBuffer(rel, forkNumber, prefetch_block++);
229-
}
230-
buf = ReadBufferExtended(rel, forkNumber, block, RBM_NORMAL, NULL);
231-
ReleaseBuffer(buf);
232-
++blocks_done;
233-
}
239+
ereport(INFO,
240+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
241+
errmsg("tuple prewarm is only supported for heap relations on main fork")));
234242
}
235243
}
236244

0 commit comments

Comments
 (0)