Skip to content

Commit df4f3ab

Browse files
Add show_data option to pg_get_wal_block_info.
Allow users to opt out of returning FPI data and block data from pg_get_wal_block_info as an optimization. Testing has shown that this can make function execution over twice as fast in some cases. When pg_get_wal_block_info is called with "show_data := false", it always returns NULL values for its block_data and block_fpi_data bytea output parameters. Nothing else changes. In particular, the function will still return the usual per-block summary of block data/FPI space overhead. Use of "show_data := false" is therefore feasible with all queries that don't specifically require these raw binary strings. Follow-up to recent work in commit 122376f. There still hasn't been a stable release with the pg_get_wal_block_info function, so no bump in the pg_walinspect extension version. Per suggestion from Melanie Plageman. Author: Peter Geoghegan <pg@bowt.ie> Discussion: https://postgr.es/m/CAAKRu_bJvbcYBRj2cN6G2xV7B7-Ja+pjTO1nEnEhRR8OXYiABA@mail.gmail.com Discussion: https://postgr.es/m/CAH2-Wzm9shOkEDM10_+qOZkRSQhKVxwBFiehH6EHWQQRd_rDPw@mail.gmail.com
1 parent 6ee3020 commit df4f3ab

File tree

6 files changed

+39
-24
lines changed

6 files changed

+39
-24
lines changed

contrib/pg_walinspect/expected/oldextversions.out

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ ERROR: WAL start LSN must be less than current LSN
5050
ALTER EXTENSION pg_walinspect UPDATE TO '1.1';
5151
-- List what version 1.1 contains.
5252
\dx+ pg_walinspect
53-
Objects in extension "pg_walinspect"
54-
Object description
55-
--------------------------------------------------
56-
function pg_get_wal_block_info(pg_lsn,pg_lsn)
53+
Objects in extension "pg_walinspect"
54+
Object description
55+
-------------------------------------------------------
56+
function pg_get_wal_block_info(pg_lsn,pg_lsn,boolean)
5757
function pg_get_wal_record_info(pg_lsn)
5858
function pg_get_wal_records_info(pg_lsn,pg_lsn)
5959
function pg_get_wal_stats(pg_lsn,pg_lsn,boolean)

contrib/pg_walinspect/expected/pg_walinspect.out

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ SELECT has_function_privilege('regress_pg_walinspect',
166166
(1 row)
167167

168168
SELECT has_function_privilege('regress_pg_walinspect',
169-
'pg_get_wal_block_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- no
169+
'pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- no
170170
has_function_privilege
171171
------------------------
172172
f
@@ -196,7 +196,7 @@ SELECT has_function_privilege('regress_pg_walinspect',
196196
(1 row)
197197

198198
SELECT has_function_privilege('regress_pg_walinspect',
199-
'pg_get_wal_block_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes
199+
'pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes
200200
has_function_privilege
201201
------------------------
202202
t
@@ -210,7 +210,7 @@ GRANT EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn)
210210
TO regress_pg_walinspect;
211211
GRANT EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean)
212212
TO regress_pg_walinspect;
213-
GRANT EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn)
213+
GRANT EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn, boolean)
214214
TO regress_pg_walinspect;
215215
SELECT has_function_privilege('regress_pg_walinspect',
216216
'pg_get_wal_record_info(pg_lsn)', 'EXECUTE'); -- yes
@@ -234,7 +234,7 @@ SELECT has_function_privilege('regress_pg_walinspect',
234234
(1 row)
235235

236236
SELECT has_function_privilege('regress_pg_walinspect',
237-
'pg_get_wal_block_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes
237+
'pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes
238238
has_function_privilege
239239
------------------------
240240
t
@@ -246,7 +246,7 @@ REVOKE EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn)
246246
FROM regress_pg_walinspect;
247247
REVOKE EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean)
248248
FROM regress_pg_walinspect;
249-
REVOKE EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn)
249+
REVOKE EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn, boolean)
250250
FROM regress_pg_walinspect;
251251
-- ===================================================================
252252
-- Clean up

contrib/pg_walinspect/pg_walinspect--1.0--1.1.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ DROP FUNCTION pg_get_wal_stats_till_end_of_wal(pg_lsn, boolean);
1212
--
1313
CREATE FUNCTION pg_get_wal_block_info(IN start_lsn pg_lsn,
1414
IN end_lsn pg_lsn,
15+
IN show_data boolean DEFAULT true,
1516
OUT start_lsn pg_lsn,
1617
OUT end_lsn pg_lsn,
1718
OUT prev_lsn pg_lsn,
@@ -37,5 +38,5 @@ RETURNS SETOF record
3738
AS 'MODULE_PATHNAME', 'pg_get_wal_block_info'
3839
LANGUAGE C STRICT PARALLEL SAFE;
3940

40-
REVOKE EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn) FROM PUBLIC;
41-
GRANT EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn) TO pg_read_server_files;
41+
REVOKE EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) FROM PUBLIC;
42+
GRANT EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) TO pg_read_server_files;

contrib/pg_walinspect/pg_walinspect.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ static void GetWalStats(FunctionCallInfo fcinfo,
5959
XLogRecPtr start_lsn,
6060
XLogRecPtr end_lsn,
6161
bool stats_per_record);
62-
static void GetWALBlockInfo(FunctionCallInfo fcinfo, XLogReaderState *record);
62+
static void GetWALBlockInfo(FunctionCallInfo fcinfo, XLogReaderState *record,
63+
bool show_data);
6364

6465
/*
6566
* Return the LSN up to which the server has WAL.
@@ -244,7 +245,8 @@ GetWALRecordInfo(XLogReaderState *record, Datum *values,
244245
* Keep this in sync with GetWALRecordInfo.
245246
*/
246247
static void
247-
GetWALBlockInfo(FunctionCallInfo fcinfo, XLogReaderState *record)
248+
GetWALBlockInfo(FunctionCallInfo fcinfo, XLogReaderState *record,
249+
bool show_data)
248250
{
249251
#define PG_GET_WAL_BLOCK_INFO_COLS 20
250252
int block_id;
@@ -359,7 +361,7 @@ GetWALBlockInfo(FunctionCallInfo fcinfo, XLogReaderState *record)
359361
nulls[i++] = true;
360362

361363
/* block_data output */
362-
if (blk->has_data)
364+
if (blk->has_data && show_data)
363365
{
364366
bytea *block_data;
365367

@@ -372,7 +374,7 @@ GetWALBlockInfo(FunctionCallInfo fcinfo, XLogReaderState *record)
372374
nulls[i++] = true;
373375

374376
/* block_fpi_data output */
375-
if (blk->has_image)
377+
if (blk->has_image && show_data)
376378
{
377379
PGAlignedBlock buf;
378380
Page page;
@@ -410,6 +412,7 @@ pg_get_wal_block_info(PG_FUNCTION_ARGS)
410412
{
411413
XLogRecPtr start_lsn = PG_GETARG_LSN(0);
412414
XLogRecPtr end_lsn = PG_GETARG_LSN(1);
415+
bool show_data = PG_GETARG_BOOL(2);
413416
XLogReaderState *xlogreader;
414417
MemoryContext old_cxt;
415418
MemoryContext tmp_cxt;
@@ -435,7 +438,7 @@ pg_get_wal_block_info(PG_FUNCTION_ARGS)
435438
/* Use the tmp context so we can clean up after each tuple is done */
436439
old_cxt = MemoryContextSwitchTo(tmp_cxt);
437440

438-
GetWALBlockInfo(fcinfo, xlogreader);
441+
GetWALBlockInfo(fcinfo, xlogreader, show_data);
439442

440443
/* clean up and switch back */
441444
MemoryContextSwitchTo(old_cxt);

contrib/pg_walinspect/sql/pg_walinspect.sql

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ SELECT has_function_privilege('regress_pg_walinspect',
101101
SELECT has_function_privilege('regress_pg_walinspect',
102102
'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- no
103103
SELECT has_function_privilege('regress_pg_walinspect',
104-
'pg_get_wal_block_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- no
104+
'pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- no
105105

106106
-- Functions accessible by users with role pg_read_server_files.
107107
GRANT pg_read_server_files TO regress_pg_walinspect;
@@ -113,7 +113,7 @@ SELECT has_function_privilege('regress_pg_walinspect',
113113
SELECT has_function_privilege('regress_pg_walinspect',
114114
'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes
115115
SELECT has_function_privilege('regress_pg_walinspect',
116-
'pg_get_wal_block_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes
116+
'pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes
117117

118118
REVOKE pg_read_server_files FROM regress_pg_walinspect;
119119

@@ -124,7 +124,7 @@ GRANT EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn)
124124
TO regress_pg_walinspect;
125125
GRANT EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean)
126126
TO regress_pg_walinspect;
127-
GRANT EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn)
127+
GRANT EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn, boolean)
128128
TO regress_pg_walinspect;
129129

130130
SELECT has_function_privilege('regress_pg_walinspect',
@@ -134,15 +134,15 @@ SELECT has_function_privilege('regress_pg_walinspect',
134134
SELECT has_function_privilege('regress_pg_walinspect',
135135
'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes
136136
SELECT has_function_privilege('regress_pg_walinspect',
137-
'pg_get_wal_block_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes
137+
'pg_get_wal_block_info(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes
138138

139139
REVOKE EXECUTE ON FUNCTION pg_get_wal_record_info(pg_lsn)
140140
FROM regress_pg_walinspect;
141141
REVOKE EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn)
142142
FROM regress_pg_walinspect;
143143
REVOKE EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean)
144144
FROM regress_pg_walinspect;
145-
REVOKE EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn)
145+
REVOKE EXECUTE ON FUNCTION pg_get_wal_block_info(pg_lsn, pg_lsn, boolean)
146146
FROM regress_pg_walinspect;
147147

148148
-- ===================================================================

doc/src/sgml/pgwalinspect.sgml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ block_ref |
133133

134134
<varlistentry>
135135
<term>
136-
<function>pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn) returns setof record</function>
136+
<function>pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record</function>
137137
</term>
138138

139139
<listitem>
@@ -209,10 +209,21 @@ block_fpi_data |
209209
<para>
210210
The <function>pg_filenode_relation</function> function (see
211211
<xref linkend="functions-admin-dblocation"/>) can help you to
212-
determine which block/relation was modified by each WAL record
213-
during original execution
212+
determine which relation was modified during original execution
214213
</para>
215214
</tip>
215+
<para>
216+
It is possible for clients to avoid the overhead of
217+
materializing block data. This may make function execution
218+
significantly faster. When <replaceable>show_data</replaceable>
219+
is set to <literal>false</literal>, <structfield>block_data</structfield>
220+
and <structfield>block_fpi_data</structfield> values are omitted
221+
(that is, the <structfield>block_data</structfield> and
222+
<structfield>block_fpi_data</structfield> <literal>OUT</literal>
223+
arguments are <literal>NULL</literal> for all rows returned).
224+
Obviously, this optimization is only feasible with queries where
225+
block data isn't truly required.
226+
</para>
216227
<para>
217228
The function raises an error if
218229
<replaceable>start_lsn</replaceable> is not available.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy