]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Allow index_create to suppress index_build progress reporting
authorÁlvaro Herrera <alvherre@kurilemu.de>
Sun, 5 Apr 2026 11:34:08 +0000 (13:34 +0200)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Sun, 5 Apr 2026 11:34:08 +0000 (13:34 +0200)
A future REPACK patch wants a way to suppress index_build doing its
progress reports when building an index, because that would interfere
with repack's own reporting; so add an INDEX_CREATE_SUPPRESS_PROGRESS
bit that enables this.

Furthermore, change the index_create_copy() API so that it takes flag
bits for index_create() and passes them unchanged.  This gives its
callers more direct control, which eases the interface -- now its
callers can pass the INDEX_CREATE_SUPPRESS_PROGRESS bit directly.  We
use it for the current caller in REINDEX CONCURRENTLY, since it's also
not interested in progress reporting, since it doesn't want
index_build() to be called at all in the first place.

One thing to keep in mind, pointed out by Mihail, is that we're not
suppressing the index-AM-specific progress report updates which happen
during ambuild().  At present this is not a problem, because the values
updated by those don't overlap with those used by commands other than
CREATE INDEX; but maybe in the future we'll want the ability to suppress
them also.  (Alternatively we might want to display how each
index-build-subcommand progresses during REPACK and others.)

Author: Antonin Houska <ah@cybertec.at>
Author: Álvaro Herrera <alvherre@kurilemu.de>
Reviewed-by: Mihail Nikalayeu <mihailnikalayeu@gmail.com>
Discussion: https://postgr.es/m/102906.1773668762@localhost

src/backend/bootstrap/bootstrap.c
src/backend/catalog/heap.c
src/backend/catalog/index.c
src/backend/commands/indexcmds.c
src/include/catalog/index.h

index c52c0a6023ddf067ec5af292f68e46be1c8fd3b7..ebd41176b9446b6e23c848992262d7cec2427546 100644 (file)
@@ -1184,7 +1184,7 @@ build_indices(void)
                heap = table_open(ILHead->il_heap, NoLock);
                ind = index_open(ILHead->il_ind, NoLock);
 
-               index_build(heap, ind, ILHead->il_info, false, false);
+               index_build(heap, ind, ILHead->il_info, false, false, false);
 
                index_close(ind, NoLock);
                table_close(heap, NoLock);
index 5748aa9a1a9afd5c9f8d5aae2a150d0557a48bc4..ae6b7cda3ddfed440e666d0231288d1f0b36423c 100644 (file)
@@ -3570,7 +3570,8 @@ RelationTruncateIndexes(Relation heapRelation)
 
                /* Initialize the index and rebuild */
                /* Note: we do not need to re-establish pkey setting */
-               index_build(heapRelation, currentIndex, indexInfo, true, false);
+               index_build(heapRelation, currentIndex, indexInfo, true, false,
+                                       true);
 
                /* We're done with this index */
                index_close(currentIndex, NoLock);
index e418d67e8e422e67371db22339e2362818fd3d50..9407c357f2716e3fb0d2564b939587b31810c2d5 100644 (file)
@@ -715,6 +715,9 @@ UpdateIndexRelation(Oid indexoid,
  *                     already exists.
  *             INDEX_CREATE_PARTITIONED:
  *                     create a partitioned index (table must be partitioned)
+ *             INDEX_CREATE_SUPPRESS_PROGRESS:
+ *                     don't report progress during the index build.
+ *
  * constr_flags: flags passed to index_constraint_create
  *             (only if INDEX_CREATE_ADD_CONSTRAINT is set)
  * allow_system_table_mods: allow table to be a system catalog
@@ -760,6 +763,7 @@ index_create(Relation heapRelation,
        bool            invalid = (flags & INDEX_CREATE_INVALID) != 0;
        bool            concurrent = (flags & INDEX_CREATE_CONCURRENT) != 0;
        bool            partitioned = (flags & INDEX_CREATE_PARTITIONED) != 0;
+       bool            progress = (flags & INDEX_CREATE_SUPPRESS_PROGRESS) == 0;
        char            relkind;
        TransactionId relfrozenxid;
        MultiXactId relminmxid;
@@ -1276,7 +1280,8 @@ index_create(Relation heapRelation,
        }
        else
        {
-               index_build(heapRelation, indexRelation, indexInfo, false, true);
+               index_build(heapRelation, indexRelation, indexInfo, false, true,
+                                       progress);
        }
 
        /*
@@ -1292,19 +1297,20 @@ index_create(Relation heapRelation,
  * index_create_copy
  *
  * Create an index based on the definition of the one provided by caller.  The
- * index is inserted into catalogs. If 'concurrently' is TRUE, it needs to be
- * built later on; otherwise it's built immediately.
+ * index is inserted into catalogs.  'flags' are passed directly to
+ * index_create.
  *
  * "tablespaceOid" is the tablespace to use for this index.
  */
 Oid
-index_create_copy(Relation heapRelation, bool concurrently,
+index_create_copy(Relation heapRelation, uint16 flags,
                                  Oid oldIndexId, Oid tablespaceOid, const char *newName)
 {
        Relation        indexRelation;
        IndexInfo  *oldInfo,
                           *newInfo;
        Oid                     newIndexId = InvalidOid;
+       bool            concurrently = (flags & INDEX_CREATE_CONCURRENT) != 0;
        HeapTuple       indexTuple,
                                classTuple;
        Datum           indclassDatum,
@@ -1318,7 +1324,6 @@ index_create_copy(Relation heapRelation, bool concurrently,
        List       *indexColNames = NIL;
        List       *indexExprs = NIL;
        List       *indexPreds = NIL;
-       int                     flags = 0;
 
        indexRelation = index_open(oldIndexId, RowExclusiveLock);
 
@@ -1448,9 +1453,6 @@ index_create_copy(Relation heapRelation, bool concurrently,
                stattargets[i].isnull = isnull;
        }
 
-       if (concurrently)
-               flags = INDEX_CREATE_SKIP_BUILD | INDEX_CREATE_CONCURRENT;
-
        /*
         * Now create the new index.
         *
@@ -1538,7 +1540,7 @@ index_concurrently_build(Oid heapRelationId,
        indexInfo->ii_BrokenHotChain = false;
 
        /* Now build the index */
-       index_build(heapRel, indexRelation, indexInfo, false, true);
+       index_build(heapRel, indexRelation, indexInfo, false, true, true);
 
        /* Roll back any GUC changes executed by index functions */
        AtEOXact_GUC(false, save_nestlevel);
@@ -3009,6 +3011,7 @@ index_update_stats(Relation rel,
  *
  * isreindex indicates we are recreating a previously-existing index.
  * parallel indicates if parallelism may be useful.
+ * progress indicates if the backend should update its progress info.
  *
  * Note: before Postgres 8.2, the passed-in heap and index Relations
  * were automatically closed by this routine.  This is no longer the case.
@@ -3019,7 +3022,8 @@ index_build(Relation heapRelation,
                        Relation indexRelation,
                        IndexInfo *indexInfo,
                        bool isreindex,
-                       bool parallel)
+                       bool parallel,
+                       bool progress)
 {
        IndexBuildResult *stats;
        Oid                     save_userid;
@@ -3070,6 +3074,7 @@ index_build(Relation heapRelation,
        RestrictSearchPath();
 
        /* Set up initial progress report status */
+       if (progress)
        {
                const int       progress_index[] = {
                        PROGRESS_CREATEIDX_PHASE,
@@ -3827,7 +3832,7 @@ reindex_index(const ReindexStmt *stmt, Oid indexId,
 
        /* Initialize the index and rebuild */
        /* Note: we do not need to re-establish pkey setting */
-       index_build(heapRelation, iRel, indexInfo, true, true);
+       index_build(heapRelation, iRel, indexInfo, true, true, progress);
 
        /* Re-allow use of target index */
        ResetReindexProcessing();
index cba379810c7797af2712c04607eb0bcba89586e4..9ab74c8df0a1b69ba17d713649fac995ac6c48de 100644 (file)
@@ -3990,7 +3990,9 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein
 
                /* Create new index definition based on given index */
                newIndexId = index_create_copy(heapRel,
-                                                                          true,
+                                                                          INDEX_CREATE_CONCURRENT |
+                                                                          INDEX_CREATE_SKIP_BUILD |
+                                                                          INDEX_CREATE_SUPPRESS_PROGRESS,
                                                                           idx->indexId,
                                                                           tablespaceid,
                                                                           concurrentName);
index ed9e4c37d27a5efa702861ecf6278e0bb354492e..9aee82263478146983deb274c44d616326e37247 100644 (file)
@@ -71,6 +71,7 @@ extern void index_check_primary_key(Relation heapRel,
 #define        INDEX_CREATE_IF_NOT_EXISTS                      (1 << 4)
 #define        INDEX_CREATE_PARTITIONED                        (1 << 5)
 #define INDEX_CREATE_INVALID                           (1 << 6)
+#define INDEX_CREATE_SUPPRESS_PROGRESS         (1 << 7)
 
 extern Oid     index_create(Relation heapRelation,
                                                 const char *indexRelationName,
@@ -101,7 +102,7 @@ extern Oid  index_create(Relation heapRelation,
 #define        INDEX_CONSTR_CREATE_REMOVE_OLD_DEPS     (1 << 4)
 #define        INDEX_CONSTR_CREATE_WITHOUT_OVERLAPS (1 << 5)
 
-extern Oid     index_create_copy(Relation heapRelation, bool concurrently,
+extern Oid     index_create_copy(Relation heapRelation, uint16 flags,
                                                          Oid oldIndexId, Oid tablespaceOid,
                                                          const char *newName);
 
@@ -148,7 +149,8 @@ extern void index_build(Relation heapRelation,
                                                Relation indexRelation,
                                                IndexInfo *indexInfo,
                                                bool isreindex,
-                                               bool parallel);
+                                               bool parallel,
+                                               bool progress);
 
 extern void validate_index(Oid heapId, Oid indexId, Snapshot snapshot);