Until now index_concurrently_swap() directly modified pgstat internal
datastructures. That will break with the introduction of shared memory
statistics and seems off architecturally.
This is done separately from the - quite large - shared memory statistics
patch to make review easier.
Author: Andres Freund <andres@anarazel.de>
Author: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Reviewed-By: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Discussion: https://postgr.es/m/
20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de
changeDependenciesOf(RelationRelationId, oldIndexId, newIndexId);
changeDependenciesOn(RelationRelationId, oldIndexId, newIndexId);
- /*
- * Copy over statistics from old to new index
- */
- {
- PgStat_StatTabEntry *tabentry;
-
- tabentry = pgstat_fetch_stat_tabentry(oldIndexId);
- if (tabentry)
- {
- if (pgstat_relation_should_count(newClassRel))
- {
- newClassRel->pgstat_info->t_counts.t_numscans = tabentry->numscans;
- newClassRel->pgstat_info->t_counts.t_tuples_returned = tabentry->tuples_returned;
- newClassRel->pgstat_info->t_counts.t_tuples_fetched = tabentry->tuples_fetched;
- newClassRel->pgstat_info->t_counts.t_blocks_fetched = tabentry->blocks_fetched;
- newClassRel->pgstat_info->t_counts.t_blocks_hit = tabentry->blocks_hit;
-
- /*
- * The data will be sent by the next pgstat_report_stat()
- * call.
- */
- }
- }
- }
+ /* copy over statistics from old to new index */
+ pgstat_copy_relation_stats(newClassRel, oldClassRel);
/* Copy data of pg_statistic from the old index to the new one */
CopyStatistics(oldIndexId, newIndexId);
static HTAB *pgStatTabHash = NULL;
+/*
+ * Copy stats between relations. This is used for things like REINDEX
+ * CONCURRENTLY.
+ */
+void
+pgstat_copy_relation_stats(Relation dst, Relation src)
+{
+ PgStat_StatTabEntry *srcstats;
+
+ srcstats = pgstat_fetch_stat_tabentry(RelationGetRelid(src));
+
+ if (!srcstats)
+ return;
+
+ if (pgstat_relation_should_count(dst))
+ {
+ /*
+ * XXX: temporarily this does not actually quite do what the name
+ * says, and just copy index related fields. A subsequent commit will
+ * do more.
+ */
+
+ dst->pgstat_info->t_counts.t_numscans = srcstats->numscans;
+ dst->pgstat_info->t_counts.t_tuples_returned = srcstats->tuples_returned;
+ dst->pgstat_info->t_counts.t_tuples_fetched = srcstats->tuples_fetched;
+ dst->pgstat_info->t_counts.t_blocks_fetched = srcstats->blocks_fetched;
+ dst->pgstat_info->t_counts.t_blocks_hit = srcstats->blocks_hit;
+
+ /* the data will be sent by the next pgstat_report_stat() call */
+ }
+}
+
/*
* Initialize a relcache entry to count access statistics.
* Called whenever a relation is opened.
* Functions in pgstat_relation.c
*/
+extern void pgstat_copy_relation_stats(Relation dstrel, Relation srcrel);
+
extern void pgstat_relation_init(Relation rel);
extern void pgstat_report_vacuum(Oid tableoid, bool shared,