From 4f55526f8a534d6b2f27b6b17cadaee0370e4cbc Mon Sep 17 00:00:00 2001 From: Ilya Gladyshev Date: Tue, 13 Dec 2022 19:42:53 +0400 Subject: [PATCH] parts_done via DefineIndex args --- src/backend/commands/indexcmds.c | 52 +++++++++++++++++++++++++++----- src/backend/commands/tablecmds.c | 7 +++-- src/backend/tcop/utility.c | 3 +- src/include/commands/defrem.h | 3 +- 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index b5b860c3ab..9fa9109b9e 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -129,6 +129,29 @@ typedef struct ReindexErrorInfo char relkind; } ReindexErrorInfo; + +/* + * Count the number of direct and indirect leaf partitions, excluding foreign + * tables. + */ +static int +num_leaf_partitions(Oid relid) +{ + int nleaves = 0; + List *childs = find_all_inheritors(relid, NoLock, NULL); + ListCell *lc; + + foreach(lc, childs) + { + Oid partrelid = lfirst_oid(lc); + if (RELKIND_HAS_STORAGE(get_rel_relkind(partrelid))) + nleaves++; + } + + list_free(childs); + return nleaves; +} + /* * CheckIndexCompatible * Determine whether an existing index definition is compatible with a @@ -530,7 +553,8 @@ DefineIndex(Oid relationId, bool check_rights, bool check_not_in_use, bool skip_build, - bool quiet) + bool quiet, + int *parts_done) { bool concurrent; char *indexRelationName; @@ -568,6 +592,7 @@ DefineIndex(Oid relationId, Oid root_save_userid; int root_save_sec_context; int root_save_nestlevel; + int root_parts_done; root_save_nestlevel = NewGUCNestLevel(); @@ -1218,8 +1243,17 @@ DefineIndex(Oid relationId, Relation parentIndex; TupleDesc parentDesc; - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_TOTAL, - nparts); + if (!OidIsValid(parentIndexId)) + { + int total_parts; + + /* Init counter of done partitions when processing root index */ + root_parts_done = 0; + parts_done = &root_parts_done; + total_parts = num_leaf_partitions(relationId); + pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_TOTAL, + total_parts); + } /* Make a local copy of partdesc->oids[], just for safety */ memcpy(part_oids, partdesc->oids, sizeof(Oid) * nparts); @@ -1426,13 +1460,11 @@ DefineIndex(Oid relationId, indexRelationId, /* this is our child */ createdConstraintId, is_alter_table, check_rights, check_not_in_use, - skip_build, quiet); + skip_build, quiet, parts_done); SetUserIdAndSecContext(child_save_userid, child_save_sec_context); } - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - i + 1); free_attrmap(attmap); } @@ -1483,9 +1515,15 @@ DefineIndex(Oid relationId, /* Close the heap and we're done, in the non-concurrent case */ table_close(rel, NoLock); - /* If this is the top-level index, we're done. */ + /* + * If this is the top-level index, we're done, otherwise, increment + * done partition counter. + */ if (!OidIsValid(parentIndexId)) pgstat_progress_end_command(); + else if (parts_done != NULL) + pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, + ++(*parts_done)); return address; } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 0b352a5fff..dde57faf44 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -1216,7 +1216,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, InvalidOid, RelationGetRelid(idxRel), constraintOid, - false, false, false, false, false); + false, false, false, false, false, NULL); index_close(idxRel, AccessShareLock); } @@ -8577,7 +8577,8 @@ ATExecAddIndex(AlteredTableInfo *tab, Relation rel, check_rights, false, /* check_not_in_use - we did it already */ skip_build, - quiet); + quiet, + NULL); /* * If TryReuseIndex() stashed a relfilenumber for us, we used it for the @@ -18076,7 +18077,7 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel) DefineIndex(RelationGetRelid(attachrel), stmt, InvalidOid, RelationGetRelid(idxRel), conOid, - true, false, false, false, false); + true, false, false, false, false, NULL); } index_close(idxRel, AccessShareLock); diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 247d0816ad..daefd726cc 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1549,7 +1549,8 @@ ProcessUtilitySlow(ParseState *pstate, true, /* check_rights */ true, /* check_not_in_use */ false, /* skip_build */ - false); /* quiet */ + false, /* quiet */ + NULL); /* * Add the CREATE INDEX node itself to stash right away; diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index 1d3ce246c9..b6eb8564c1 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -33,7 +33,8 @@ extern ObjectAddress DefineIndex(Oid relationId, bool check_rights, bool check_not_in_use, bool skip_build, - bool quiet); + bool quiet, + int *parts_done); extern void ExecReindex(ParseState *pstate, ReindexStmt *stmt, bool isTopLevel); extern char *makeObjectName(const char *name1, const char *name2, const char *label); -- 2.30.2