Re: [Patch] New pg_stat_tablespace view

From: Zsolt Parragi <zsolt(dot)parragi(at)percona(dot)com>
To: shihao zhong <zhong950419(at)gmail(dot)com>
Cc: pgsql-hackers(at)lists(dot)postgresql(dot)org, Bernd Reiß <bd_reiss(at)gmx(dot)at>, Ahmed Gouda <ahmed(dot)gouda(at)cybertec(dot)at>
Subject: Re: [Patch] New pg_stat_tablespace view
Date: 2026-10-06 22:06:26
Message-ID: CAN4CZFOPiD-V8k5Pv7MrM-BzCK531p2HohA4+V5hNg8A73ysog@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hello

I see two more issue in v9.

1: there's a window for a permanent statistics leak when a tablespace
is dropped.
Maybe entries should be created eagerly during create tablespace and
only looked up with create = false for aggregation?

setup { SET allow_in_place_tablespaces = on; }
setup { CREATE TABLESPACE ts_res LOCATION ''; }
setup
{
CREATE TABLE t_res (a int) TABLESPACE ts_res;
INSERT INTO t_res SELECT generate_series(1, 100);
CREATE TABLE ts_oid AS SELECT oid FROM pg_tablespace WHERE spcname = 'ts_res';
}

# Session teardowns run before this, so t_res is already gone.
teardown { DROP TABLESPACE IF EXISTS ts_res; }

session s1
setup
{
SET debug_parallel_query = off;
SELECT count(*) FROM t_res;
SELECT pg_stat_force_next_flush();
}
step s1_read { SELECT count(*) FROM t_res; }
step s1_flush { SELECT pg_stat_force_next_flush(); }

session s2
step s2_drop_table { DROP TABLE t_res; }
step s2_drop_ts { DROP TABLESPACE ts_res; }
step s2_check
{
SELECT EXISTS (SELECT FROM pg_tablespace t WHERE t.oid = o.oid) AS in_catalog,
pg_stat_have_stats('tablespace', 0, o.oid::int8) AS have_stats
FROM ts_oid o;
}
teardown
{
DROP TABLE IF EXISTS t_res;
DROP TABLE ts_oid;
}

# s1's pending counts flush after the drop
permutation s2_check s1_read s2_drop_table s2_drop_ts s2_check s1_flush s2_check

2: Are you sure the transaction move behavior is correct? The test
case even documents it:

+-- A relation moved to another tablespace must be credited to the new one in
+-- pg_stat_tablespace. pgstat_info is preserved across a relcache rebuild, so
+-- doing this while the relation is already in use exercises
+-- pgstat_relation_update_tablespace().
+CREATE TABLE tablespace_stats_move (a int);
+INSERT INTO tablespace_stats_move SELECT generate_series(1, 10);
+SELECT pg_stat_force_next_flush();
+SELECT tup_inserted AS stats_move_before FROM pg_stat_tablespace
+ WHERE tablespace_name = 'regress_tblspace' \gset
+
+BEGIN;
+SELECT count(*) > 0 FROM tablespace_stats_move;
+ALTER TABLE tablespace_stats_move SET TABLESPACE regress_tblspace;
+INSERT INTO tablespace_stats_move SELECT generate_series(1, 10);
+COMMIT;
+SELECT pg_stat_force_next_flush();

But looking at this test case, the table was read in the old
tablespace, not in the new, so attributing this to the new tablespace
doesn't seem right to me?

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Manu 2026-10-06 22:24:34 Re: Bug: ATTACH PARTITION can leave rows violating default partition constraint
Previous Message Matthias van de Meent 2026-10-06 22:00:57 Re: Reducing relcache memory usage: deduping index shapes