Fix tracking of temp table relation extensions as writes

Karina figured out that I (Andres) confused BufferUsage.temp_blks_written with
BufferUsage.local_blks_written in fcdda1e4b5.

Tests in core PG can't easily test this, as BufferUsage is just used for
EXPLAIN (ANALYZE, BUFFERS) and pg_stat_statements. Thus this commit adds tests
for this to pg_stat_statements.

Reported-by: Karina Litskevich <litskevichkarina@gmail.com>
Author: Karina Litskevich <litskevichkarina@gmail.com>
Author: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/CACiT8ibxXA6+0amGikbeFhm8B84XdQVo6D0Qfd1pQ1s8zpsnxQ@mail.gmail.com
Backpatch: 16-, where fcdda1e4b5 was merged
This commit is contained in:
Andres Freund 2023-09-13 19:14:09 -07:00
parent a0d87bcd9b
commit 7369798a83
3 changed files with 47 additions and 1 deletions

View File

@ -139,6 +139,33 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
1 | 1 | SELECT pg_stat_statements_reset()
(10 rows)
-- check that [temp] table relation extensions are tracked as writes
CREATE TABLE pgss_extend_tab (a int, b text);
CREATE TEMP TABLE pgss_extend_temp_tab (a int, b text);
SELECT pg_stat_statements_reset();
pg_stat_statements_reset
--------------------------
(1 row)
INSERT INTO pgss_extend_tab (a, b) SELECT generate_series(1, 1000), 'something';
INSERT INTO pgss_extend_temp_tab (a, b) SELECT generate_series(1, 1000), 'something';
WITH sizes AS (
SELECT
pg_relation_size('pgss_extend_tab') / current_setting('block_size')::int8 AS rel_size,
pg_relation_size('pgss_extend_temp_tab') / current_setting('block_size')::int8 AS temp_rel_size
)
SELECT
SUM(local_blks_written) >= (SELECT temp_rel_size FROM sizes) AS temp_written_ok,
SUM(local_blks_dirtied) >= (SELECT temp_rel_size FROM sizes) AS temp_dirtied_ok,
SUM(shared_blks_written) >= (SELECT rel_size FROM sizes) AS written_ok,
SUM(shared_blks_dirtied) >= (SELECT rel_size FROM sizes) AS dirtied_ok
FROM pg_stat_statements;
temp_written_ok | temp_dirtied_ok | written_ok | dirtied_ok
-----------------+-----------------+------------+------------
t | t | t | t
(1 row)
SELECT pg_stat_statements_reset();
pg_stat_statements_reset
--------------------------

View File

@ -73,4 +73,23 @@ MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a
DROP TABLE pgss_dml_tab;
SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
-- check that [temp] table relation extensions are tracked as writes
CREATE TABLE pgss_extend_tab (a int, b text);
CREATE TEMP TABLE pgss_extend_temp_tab (a int, b text);
SELECT pg_stat_statements_reset();
INSERT INTO pgss_extend_tab (a, b) SELECT generate_series(1, 1000), 'something';
INSERT INTO pgss_extend_temp_tab (a, b) SELECT generate_series(1, 1000), 'something';
WITH sizes AS (
SELECT
pg_relation_size('pgss_extend_tab') / current_setting('block_size')::int8 AS rel_size,
pg_relation_size('pgss_extend_temp_tab') / current_setting('block_size')::int8 AS temp_rel_size
)
SELECT
SUM(local_blks_written) >= (SELECT temp_rel_size FROM sizes) AS temp_written_ok,
SUM(local_blks_dirtied) >= (SELECT temp_rel_size FROM sizes) AS temp_dirtied_ok,
SUM(shared_blks_written) >= (SELECT rel_size FROM sizes) AS written_ok,
SUM(shared_blks_dirtied) >= (SELECT rel_size FROM sizes) AS dirtied_ok
FROM pg_stat_statements;
SELECT pg_stat_statements_reset();

View File

@ -431,7 +431,7 @@ ExtendBufferedRelLocal(BufferManagerRelation bmr,
*extended_by = extend_by;
pgBufferUsage.temp_blks_written += extend_by;
pgBufferUsage.local_blks_written += extend_by;
return first_block;
}